Subversion Repositories Applications.projet

Rev

Rev 423 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 ddelon 1
<?php
431 mathias 2
// $Id: ezmlm.php,v 1.5 2007/04/19 15:34:35 neiluj Exp $
2 ddelon 3
//
4
// ezmlm.php - ezmlm-php v2.0
5
// --------------------------------------------------------------
6
// As the site that ezmlm-php was developed for grew, and grew
7
// the old system used had to be bandaid fixed more, and more
8
// because the site started moving to an object oriented design
9
// for all the backend systems and ezmlm wasn't playing nice
10
// with the new design. So, ezmlm was redesigned too, and here
11
// it is.
12
//
13
// It may look a little more confusing if you're not used to
14
// working with objects but it actually is much more effiecient
15
// and organized in it's new incarnation.
16
// Simply edit the variables in the ezmlm-php constructor below
17
// just like you would with the old ezmlm-php-config.php file,
18
// if you're unsure howto do this check out the file CONFIG,
19
// then check the USAGE file for how you should include and use
20
// the new classes if you are integrating ezmlm-php into your
21
// site.
22
// (SEARCH FOR: USER-CONFIG to find where to edit.)
23
// --------------------------------------------------------------
24
 
25
require_once("ezmlm-errors.def");
26
require_once("ezmlm-parser.php");
27
require_once("ezmlm-threads.php");
28
require_once("ezmlm-listinfo.php");
29
require_once("ezmlm-msgdisplay.php");
30
require_once("ezmlm-repondre.php");
31
require_once("ezmlm-author.php");
32
 
431 mathias 33
$GLOBALS['mois'] = array ('Jan', 'F�v', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil', 'Ao�t', 'Sept', 'Oct', 'Nov', 'D�c') ;
2 ddelon 34
 
35
// CLASS: ezmlm_php
36
// the base class, contains common functions and the config
37
class ezmlm_php {
38
	var $listdir;		// the root directory of the list
39
	var $listname;		// the list address upto the @
40
	var $listdomain;	// the domain for the list
41
 
42
	var $tempdir;		// a directory in which the webserver can write cache files
43
 
44
	var $sendheaders;	// send generic page headers
45
	var $sendbody;		// send generic body definitions
46
	var $sendfooters;	// send generic page footers
47
	var $includebefore;	// a file to include before the content
48
	var $includeafter;	// a file to include after the content
49
 
50
	var $href;		// what to add before the '?param=value' in links
51
 
52
	var $prefertype;	// what mime type do you prefer?
53
	var $showheaders;	// what headers should we show?
54
 
55
	var $msgtemplate;	// the template for displaying messages (see the file TEMPLATE)
56
 
57
	var $tablecolours;	// what are the colours for the table rows?
58
 
59
	var $thread_subjlen;	// the maximum length of subjects in the thread view (0 = no limit)
60
 
61
	var $forcehref;		// force the base of makelink();
62
 
63
	// --------- END USER CONFIGURATION ---------
64
 
65
	// Internal variables
66
	var $action = '';
67
	var $actionargs;
68
 
69
	function ezmlm_php() {
431 mathias 70
 
2 ddelon 71
		// USER-CONFIG section
72
		// these variables act the same way ezmlm-php-config.php did in the first release
73
		// simply edit these variables to match your setup
431 mathias 74
 
208 neiluj 75
		$this->listdir		= "";
76
		$this->listname		= "";
77
		$this->listdomain	= "";
431 mathias 78
 
208 neiluj 79
		$this->tempdir		= "";
2 ddelon 80
 
81
		$this->sendheaders	= TRUE;
82
		$this->sendbody		= TRUE;
83
		$this->sendfooters	= TRUE;
84
		$this->includebefore	= "";
85
		$this->includeafter	= "";
86
 
87
		$this->href		= "";
88
 
89
		$this->prefertype	= "text/html";
90
		$this->showheaders	= array(
91
						"to",
92
						"from",
93
						"subject",
94
						"date"
95
					);
431 mathias 96
        $this->header_en_francais = array ('to' => 'A',
2 ddelon 97
                                            'from' => 'De',
98
                                            'subject' => 'Sujet',
99
                                            'date' => 'Date') ;
100
 
101
		$this->msgtemplate	= "<pre><ezmlm-body></pre>"; // if blank it will use the internal one
102
 
103
		$this->tablecolours	= array(
104
						// delete the next line if you don't want alternating colours
105
						"#eeeeee",
106
						"#ffffff"
107
					);
108
 
109
		$this->thread_subjlen	= 55;
110
 
111
		// --- STOP EDITING HERE ---
112
		// some sanity checking
113
		if ((!is_dir($this->listdir . "/archive")) or
114
		    (!is_dir($this->listdir . "/archive/authors")) or
115
		    (!is_dir($this->listdir . "/archive/threads")) or
116
		    (!is_dir($this->listdir . "/archive/subjects"))) {
117
            return false ;
118
			/*$this->error(EZMLM_INVALID_DIR,TRUE);*/
119
		}
120
	}
121
 
122
	function set_action($action) {
123
		if (is_array($action)) { $this->error(EZMLM_INVALID_SYNTAX,TRUE); }
124
		$this->action = $action;
125
	}
126
	function set_actionargs($actionargs) {
127
		if ($this->action == '') { $this->error(EZMLM_INVALID_SYNTAX,TRUE); }
128
		$this->actionargs = $actionargs;
129
	}
130
 
131
	function run() {
132
		if ($this->action == '') { $this->error(EZMLM_INVALID_SYNTAX,TRUE); }
133
 
134
		if ($this->sendheaders) { $this->sendheaders(); }
135
		if ($this->sendbody) { $this->sendbody(); }
136
		if ($this->includebefore != '') { @include_once($this->includebefore); }
137
 
138
		switch ($this->action) {
139
			case "list_info":
140
				$info = new ezmlm_listinfo();
141
				$info->display();
142
				break;
143
			case "show_msg":
144
				if (count($this->actionargs) < 2) {
145
					$this->error(EZMLM_INVALID_SYNTAX,TRUE);
146
				}
147
				$show_msg = new ezmlm_msgdisplay();
148
				$show_msg->display($this->actionargs[0] . "/" . $this->actionargs[1]);
149
				break;
150
			case "show_threads":
151
				$threads = new ezmlm_threads();
152
				$threads->load($this->actionargs[0]);
153
				break;
154
			case "show_author_msgs":
155
				$author = new ezmlm_author();
156
				$author->display($this->actionargs[0]);
157
				break;
158
		}
159
 
160
		if ($this->includeafter != '') { @include_once($this->includeafter); }
161
		if ($this->sendfooters) { $this->sendfooters(); }
162
	}
163
 
164
	function sendheaders() {
165
		print "<html><head>\n";
166
		print "<style type=\"text/css\">\n";
167
		print "<!--\n";
168
		print ".heading { font-family: helvetica; font-size: 16px; line-height: 18px; font-weight: bold; }\n";
169
		print "//-->\n";
170
		print "</style>\n";
171
		print "</head>\n";
172
	}
173
 
174
	function sendbody() {
175
		print "<body>\n";
176
	}
177
 
178
	function sendfooters() {
179
		print "</body>\n";
180
		print "</html>\n";
181
	}
431 mathias 182
 
2 ddelon 183
 
184
	// begin common functions
185
 
186
	// makehash - generates an author hash using the included makehash program
187
	function makehash($str) {
188
         $str = preg_replace ('/>/', '', $str) ;
189
        $handle = popen ('/usr/local/lib/safe_mode/makehash \''.$str.'\'', 'r') ;
190
        $hash = fread ($handle, 256) ;
191
        pclose ($handle) ;
192
		return $hash;
193
	}
194
 
195
	// makelink - writes the <a href=".."> tag
196
	function makelink($params,$text) {
197
		if ($this->forcehref != "") {
198
			$basehref = $this->forcehref;
199
		} else {
200
			$basehref = preg_replace('/^(.*)\?.*/', '\\1', $_SERVER['REQUEST_URI']);
201
		}
202
		$link = '<a href="'. $basehref . '&amp;' . $params . '">' . $text . '</a>';
203
		return $link;
204
	}
205
 
206
	// md5_of_file - provides wrapper function that emulates md5_file for PHP < 4.2.0
207
	function md5_of_file($file) {
208
		if (function_exists("md5_file")) { // php >= 4.2.0
209
			return md5_file($file);
210
		} else {
211
			if (is_file($file)) {
212
				$fd = fopen($file, "rb");
213
				$filecontents = fread($fd, filesize($file));
214
				fclose ($fd);
215
				return md5($filecontents);
216
			} else {
217
				return FALSE;
218
			}
219
		}
220
	}
221
 
222
	// protect_email - protects email address turns user@domain.com into user@d...
223
	function protect_email($str,$short = FALSE) {
224
		if (preg_match("/[a-zA-Z0-9\-\.]\@[a-zA-Z0-9\-\.]*\./", $str)) {
225
			$outstr = preg_replace("/([a-zA-Z0-9\-\.]*\@)([a-zA-Z0-9\-\.])[a-zA-Z0-9\-\.]*\.[a-zA-Z0-9\-\.]*/","\\1\\2...",$str);
226
			$outstr = preg_replace("/\</", '&lt;', $outstr);
227
			$outstr = preg_replace("/\>/", '&gt;', $outstr);
228
		} else {
229
			$outstr = $str;
230
		}
231
 
232
		if ($short) {
233
			$outstr = preg_replace("/&lt;.*&gt;/", '', $outstr);
234
			$outstr = preg_replace("/[\"']/", '', $outstr);
235
		}
236
		return trim($outstr);
237
	}
238
 
239
	// cleanup_body: sortta like protect_email, just for message bodies
240
	function cleanup_body($str) {
241
			$outstr = preg_replace("/([a-zA-Z0-9\-\.]*\@)([a-zA-Z0-9\-\.])[a-zA-Z0-9\-\.]*\.[a-zA-Z0-9\-\.]*/","\\1\\2...",$str);
242
			return $outstr;
243
	}
244
 
245
	function error($def, $critical = FALSE) {
246
		global $ezmlm_error;
247
 
248
		print "\n\n";
249
		print "<table width=600 border=1 cellpadding=3 cellspacing=0>\n";
250
		print "<tr bgcolor=\"#cccccc\"><td><b>EZMLM-PHP Error: " . $ezmlm_error[$def]['title'] . "</td></tr>\n";
251
		print "<tr bgcolor=\"#aaaaaa\"><td>" . $ezmlm_error[$def]['body'] . "</td></tr>\n";
252
		print "</table>\n\n";
253
 
254
		if ($critical) { die; }
255
	}
256
    /**
431 mathias 257
     *  Parse une chaime et supprime les probl�me d'encodage de type ISO-4 ...
2 ddelon 258
     *
259
     * @return string
260
     */
431 mathias 261
 
2 ddelon 262
    function decode_iso ($chaine) {
431 mathias 263
 
2 ddelon 264
        if (preg_match ('/windows-[0-9][0-9][0-9][0-9]/i', $chaine, $nombre)) {
265
            $reg_exp = $nombre[0] ;
208 neiluj 266
            $chaine = str_replace(' ', '', $chaine);
2 ddelon 267
        } else {
268
            $reg_exp = 'ISO-8859-15?' ;
269
        }
270
        if (preg_match ('/UTF/i', $chaine)) $reg_exp = 'UTF-8' ;
271
        preg_match_all ("/=\?$reg_exp\?(Q|B)\?(.*?)\?=/i", $chaine, $match, PREG_PATTERN_ORDER)  ;
272
        for ($i = 0; $i < count ($match[0]); $i++ ) {
431 mathias 273
 
165 alexandre_ 274
                if (strtoupper($match[1][$i]) == 'Q') {
2 ddelon 275
                    $decode = quoted_printable_decode ($match[2][$i]) ;
276
                } elseif ($match[1][$i] == 'B') {
277
                    $decode = base64_decode ($match[2][$i]) ;
278
                }
279
                $decode = preg_replace ("/_/", " ", $decode) ;
280
            if ($reg_exp == 'UTF-8') {
281
                $decode = utf8_decode ($decode) ;
431 mathias 282
            }
2 ddelon 283
            $chaine = str_replace ($match[0][$i], $decode, $chaine) ;
284
        }
285
        return $chaine ;
286
    }
431 mathias 287
 
2 ddelon 288
    /**
289
     *
290
     *
291
     * @return
292
     */
431 mathias 293
 
2 ddelon 294
    function date_francaise ($date_mail) {
431 mathias 295
        $date_mail = preg_replace ('/\(?CEST\)?/', '', $date_mail) ;
2 ddelon 296
        $numero_mois = date('m ', strtotime($date_mail)) - 1 ;
297
        $date = date ('d ', strtotime($date_mail)).$GLOBALS['mois'][$numero_mois] ; // Le jour et le mois
431 mathias 298
        $date .= date(' Y ', strtotime($date_mail)) ; // l'ann�e
2 ddelon 299
        if (date('a', strtotime($date_mail)) == 'pm') {
300
            $date .= (int) date('g', strtotime($date_mail)) + 12 ;  // Les heures
301
        } else {
302
            $date .= date('g', strtotime($date_mail)) ;
303
        }
304
        $date .= date(':i', strtotime($date_mail)) ;    // Les minutes
305
        return $date ;
306
    }
431 mathias 307
 
308
    /**
208 neiluj 309
     * Cette fonction renvoie le prefixe, cad 0 ou rien
310
     * d un nom de message, ex : pour 09, on renvoie 0
311
     * pour 12 on renvoie rien
312
     */
313
    function prefixe_nom_message($nom) {
314
    	if (preg_match ('/0([1-9][0-9]*)/', $nom, $match)) {
315
			$nom_fichier = $match[1];
316
			return '0' ;
317
		} else {
318
			return '' ;
319
		}
320
    }
2 ddelon 321
}
322
 
323
//
324
// --- END OF CLASS DEFINITION ---
325
//
326
 
327
// FIN