1#!%PERL_PATH%
2#��� perl version 5 �Τ���ǥ��쥯�ȥ�ˤ��Ʋ�������
3## mail2nikki.pl (Project SHIMONODA)
4## Version 0.75 (8/11/2001)
5
6# Copyright (C) 1998-2001  Ken-ichi HASHIMOTO, HyperNikkiSystem Project
7
8# Special Thanks:
9#  Mori Kouji <moriko@hh.iij4u.or.jp>
10#  Seiji Hamaguchi <makoto@zob.ne.jp>
11#  Masato Kawakami <masato@orange.co.jp>
12#  TOKUMITSU Satoshi <tokumitsu@three-a.co.jp>
13
14# This program is free software; you can redistribute it and/or
15# modify it under the terms of the GNU General Public License
16# as published by the Free Software Foundation; either version 2
17# of the License, or (at your option) any later version.
18
19# This program is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22# GNU General Public License for more details.
23
24# You should have received a copy of the GNU General Public License
25# along with this program; if not, write to the Free Software
26# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27
28# $Id: mail2nikki.pl.in,v 1.21 2002/12/28 13:27:02 bonaim Exp $
29
30require '%HTMLDIR%/lib/jcode.pl';
31
32# $diaryDir �����Τ���ǥ��쥯�ȥ�
33$diaryDir    = "%DIARYDIR%";
34
35# ���������륢�ɥ쥹��
36$mailAddress = '%FROMADDR%';
37# ��Ƥ�������ɥ쥹(Fromǧ��) -ʣ���Υ��ɥ쥹����Ͽ��ǽ�Ǥ�-
38@certiy_mailAddress = ('%FROMADDR%', 'second_address');
39# ���᡼��� From: ���ɥ쥹
40$recvMailAddress = '%FROMADDR%';
41# GET �λ������륢�ɥ쥹
42$cmdGetAddress = '';	## ��hnf:GET�פ����ä��᡼�륢�ɥ쥹������ޤ�
43
44# �ѥ���ɤǤ���
45$MASTERPASSWD = "%PASSWORD%";
46
47# LOGMODE ��ʸ������������  0 ���顼���Τ�, 1 ���, 2 ���Ф��ʤ�
48$LOGMODE = 0;
49# status reporting mail
50$MAILMODE = 0;  # 1 ̵����ư�����᡼��
51# use nkf?
52$NKF_USE = 1;	# 1 -> Use (default), 0 -> No Use
53# auto signature cut
54$SIG_CUT = 0;	# 1 Signature��������
55$SIG_PATTERN = '^-- $'; # Signature�γ��ϹԤ�����ɽ��
56
57# Update Namazu index?
58$NamazuExecFlag = 0;	# 0 -> no (default), 1 -> yes
59# where is hns-index?
60$MkNamazuPath = "$ENV{'HOME'}/diary/bin/hns-index";
61
62# sendmail �ξ�� �ƥ����Фˤ�äư㤦�Ǥ��礦
63$sendmail = "%SENDMAIL_PATH%";
64# nkf �ξ�� �Τ���Ƥ�
65$nkf      = "%NKF_PATH%";
66
67##  install ��ˡ
68## 1. $HOME/diary/bin/mail2nikki.pl �� ����� copy
69## 2. chmod 700 mail2nikki.pl
70## 3. mail2nikki.pl �� ����
71## 4. $HOME/diary/mail ����� ( mkdir ��Ȥä� )
72## 5. .forward ������
73#��:
74# inseki:~$ cat .forward
75#\ken,"|/home/ken/diary/bin/mail2nikki.pl "
76
77## ��������Ͽ��ˡ
78## Subject: hnf:ADD
79## ��ʸ��
80## PASSWORD: <password>
81## [DATE: 19981109]   (��ά��ǽ,��ά�� mail �������������)
82## (����1��)
83## ������ʸ
84## END ʸƬ�ޤ� hnf ����Ͽ
85
86
87############################
88### You DON'T have to change
89###
90
91# qmail ���� 600 �� permission ������
92# Thanks. masakazu@yamada.gr.jp
93umask(022);
94
95# ����Хå����åפ���Τ� ���Υե����롣
96$backupFile  = "$diaryDir/mail/backup";
97
98# �����Τ���˽��������᡼��� LOG ����¸
99$logFile        = "$diaryDir/mail/mail.log";
100# �ʰץ�
101$SimpleLogFile  = "$diaryDir/mail/simple.log";
102# ��ȥե�����
103$mailTempFile   = "$diaryDir/mail/file.$$";
104
105
106@hnfCommandHash = ('NO','DEL&ADD','ADD','DEL','GET');
107@hnfObjectHash = ('NO','DIARY','PLAN','TODO','REPEAT');
108
109
110# �᡼������
111# ��: Sendmail( "/usr/sbin/sendmail" , "aite@hoge.jp" ,
112#	        "jibun@geho.jp" , "title" , \@body );
113sub Sendmail {
114    my ( $sendmail , $to , $from , $subject , $body ) = @_;
115
116    open(MAIL,"|$sendmail -t");
117
118    print MAIL "To: $to\n";
119    print MAIL "From: <$from>\n";
120    print MAIL "Subject: $subject\n\n";
121
122    for( @$body )
123    {
124	print MAIL "$_\n";
125    }
126
127    close (MAIL);
128}
129
130sub OkMail {
131    @mbody = ( 'This messege was written by mail2nikki.pl.' ,
132	       'System transact your mail.');
133    push( @mbody , $_[0] );
134    if ($loopcheck == 0) {
135      Sendmail( $sendmail , $mailAddress
136	     , "$recvMailAddress" , "[mail2nikki] transact complete"
137	     , \@mbody );
138    }
139}
140sub NgMail {
141    @mbody = ( 'This messege was written by mail2nikki.pl.' ,
142	       'System DOESN\'T transact your mail.');
143    push( @mbody , $_[0] );
144    if ($loopcheck == 0) {
145      Sendmail( $sendmail , $mailAddress
146	     , "$recvMailAddress" , "[mail2nikki] transact faled"
147	     , \@mbody );
148    }
149}
150# ɽ����ʬ
151sub HnsPrint {
152    for( @body )
153    {
154	print OUT "$_";
155    }
156}
157
158
159# log ����¸
160sub savelog {
161    open( OUT , ">>$logFile" );
162    print OUT "---- START ----\n";
163    print OUT "---- HEAD -----\n";
164    for( @headers )
165    {
166	print OUT "$_";
167    }
168    print OUT "\n";
169    print OUT "---- HNF HEAD -----\n";
170    for( @hnfheaders )
171    {
172	if( /^(PASSWORD|PASSWD): /i )
173	{
174	    print OUT "PASSWD: ****************\n";
175	}
176	else
177	{
178	    print OUT "$_";
179	}
180    }
181    print OUT "---- HNF BODY -----\n";
182    for( @body )
183    {
184	print OUT "$_";
185    }
186    print OUT "---- HNF FOOT -----\n";
187    for( @foot )
188    {
189	print OUT "$_";
190    }
191    print OUT "---- STATE -----\n";
192    print OUT "PASSWORD : $PASSWORD \n";
193    print OUT "HNF MODE : $HnsMode \n";
194    print OUT "HNF OBJ  : $HnsObj \n";
195    print OUT "---- END ----\n";
196    close(OUT);
197}
198
199
200sub copy {
201  my ($from, $to) = @_;
202  my @tmp;
203
204  open (TEMP, $from) || die "can't open: $!";
205  while (<TEMP>) {
206    &jcode::convert(\$_, 'euc');
207    push (@tmp, $_);
208  }
209  close(TEMP);
210  open (FILE, ">$to") || die "can't open: $!";
211  foreach (@tmp) {
212    print FILE $_;
213  }
214  close(FILE);
215}
216
217
218sub copy_jis {
219  my ($from, $to) = @_;
220  my @tmp;
221
222  open (TEMP, $from) || die "can't open: $!";
223  while (<TEMP>) {
224    &jcode::convert(\$_, 'jis');
225    push (@tmp, $_);
226  }
227  close(TEMP);
228  open (FILE, ">$to") || die "can't open: $!";
229  foreach (@tmp) {
230    print FILE $_;
231  }
232  close(FILE);
233}
234
235
236sub append {
237  my ($from, $to) = @_;
238  my @tmp;
239
240  open (TEMP, $from) || die "can't open: $!";
241  while (<TEMP>) {
242    &jcode::convert(\$_, 'euc');
243    push (@tmp, $_);
244  }
245  close(TEMP);
246  open (FILE, ">>$to") || die "can't open: $!";
247  foreach (@tmp) {
248    print FILE $_;
249  }
250  close(FILE);
251}
252
253
254sub cvs_add_commit {
255	my ($file) = @_;
256	my ($filedir, $base);
257	$base = (split('/', $file))[-1];
258	$filedir = $file;
259	$filedir =~ s!/[^\/]+$!!;
260#	system("cd $filedir; cvs add $base; cvs commit -m 'Update by mail'");
261}
262
263$loopcheck = 0;
264
265# sendmail �����Ϥ��줿�إå�����Ͽ
266while($_=<STDIN>)
267{
268    if (/^Subject: \[mail2nikki\]/) {
269      $loopcheck = 1;
270    }
271    last if /^\r?\n$/;
272    s/\r?\n$/\n/;
273    if (/^\s/) {
274       $_ = pop( @headers ) . $_;
275    }
276    push( @headers,$_ );
277}
278
279# hnf �ѤΥإå�
280$hnfheadflag = 0;
281while($_=<STDIN>)
282{
283    if (/^Subject: \[mail2nikki\]/) {
284      $loopcheck = 1;
285    }
286    last if (/^\r?\n$/)&&($hnfheadflag == 1);
287    next if (/^\r?\n$/);
288    $hnfheadflag = 1;
289    s/\r?\n$/\n/;
290    push( @hnfheaders,$_ );
291}
292
293# ��������
294while($_=<STDIN>)
295 {
296    if (/^Subject: \[mail2nikki\]/) {
297      $loopcheck = 1;
298    }
299    last if /^END/;
300    last if /^!#EOF/;
301    last if /$SIG_PATTERN/o && $SIG_CUT;
302    s/\r?\n$/\n/;
303    push( @body,$_ );
304 }
305
306# �Ǹ�
307while($_=<STDIN>)
308 {
309    push( @foot,$_ );
310 }
311
312# �������ּ���
313($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
314$year = $year + 1900;
315$mon  = $mon + 1;
316$mday = "0$mday" if $mday < 10;
317$mon  = "0$mon"  if $mon  < 10;
318$sec  = "0$sec"  if $sec  < 10;
319$min  = "0$min"  if $min  < 10;
320$hour = "0$hour" if $hour < 10;
321
322if ( !( -d $diaryDir . "/" . $year ) )
323{
324    system("mkdir $diaryDir/$year;chmod 755 $diaryDir/$year");
325}
326$file = "$diaryDir/$year/d$year$mon$mday.hnf";
327$pfile = "$diaryDir/$year/y$year$mon";
328
329$HnsFlag = 0;
330$Correct = "No";
331$i = 0;
332$imax = @certiy_mailAddress - 1;
333for( @headers )
334{
335
336#    /* ǧ�� �᡼�륢�ɥ쥹 �����������Ƥʤ����ɤ�(^^;) */
337    if( /^From: / )
338    {
339#	$HnsFlag = 1 if( /$mailAddress/ );
340
341	while( $Correct eq "No" ){
342		if( /@certiy_mailAddress[$i]/ ){
343			$HnsFlag = 1;
344			$Correct = "Yes";
345			$cmdGetAddress = @certiy_mailAddress[$i];  ##
346		} elsif ($i < $imax){
347			$i = $i + 1;
348		} else {
349			$HnsFlag = 0;
350			$Correct = "Yes";
351		}
352	}
353    }
354#    /* �إå��ߤ� ���줾��� ���� (��������������֤���� ��������) */
355    if(/^Subject: (hnf|hns):(ADD|DEL|DEL&ADD|GET) *(PLAN|TODO|REPEAT)?/)
356    {
357        $HnsMode = 2 if( /ADD/ );
358        $HnsMode = 3 if( /DEL/ );
359	$HnsMode = 1 if( /DEL&ADD/ );
360	$HnsMode = 4 if( /GET/ );
361	$HnsObj = 1;
362        if( /PLAN/ )
363	{
364	    $HnsObj = 2;
365	    $file = $pfile;
366	}
367        if( /TODO/ )
368	{
369	    $HnsObj = 3;
370	    $file = "$diaryDir/todo";
371	}
372        if( /REPEAT/ )
373	{
374	    $HnsObj = 4;
375	    $file = "$diaryDir/repeat";
376	}
377    }
378}
379
380$PASSWORD = 0;
381for( @hnfheaders )
382{
383    if( /^(PASSWORD|PASSWD)\s*:\s*$MASTERPASSWD/i )
384    {
385
386#    @list = split( /\s*:\s*/ , $_ );
387#    $tmp = shift( @list );
388#    $tmp = shift( @list );
389#    $PASSWORD = 1 if ( $MASTERPASSWD =~ /$tmp/ ) ;
390
391	$PASSWORD = 1;
392	next;
393    }
394    if( /^DATE\s*:\s*/ && $HnsObj == 1 )
395    {
396	@list = split( /\s*:\s*/ , $_ );
397	$tmp = shift( @list );
398	$tmp = shift( @list );
399	chop $tmp;
400	if( $tmp =~ /([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])/ )
401	{
402	    $year = $1;
403	    if ( ! (-d $diaryDir . "/" . $year) )
404	    {
405		system("mkdir $diaryDir/$year;chmod 755 $diaryDir/$year");
406	    }
407
408	    $file = "$diaryDir/$year/d$tmp.hnf";
409	}
410	else
411	{
412	    $file = "$diaryDir/d$tmp.hnf";
413	}
414	next;
415    }
416    if( /^DATE\s*:\s*/ && $HnsObj == 2 )
417    {
418	@list = split( /\s*:\s*/ , $_ );
419	$tmp = shift( @list );
420	$tmp = shift( @list );
421	chop $tmp;
422	if( $tmp =~ /([0-9][0-9][0-9][0-9])([0-9][0-9])/ )
423	{
424	    $year = $1;
425	    if ( ! (-d $diaryDir . "/" . $year) )
426	    {
427		system("mkdir $diaryDir/$year;chmod 755 $diaryDir/$year");
428	    }
429
430	    $file = "$diaryDir/$year/y$tmp";
431	}
432	else
433	{
434	    $file = "$diaryDir/y$tmp";
435	}
436	next;
437    }
438
439    push( @userVar , $_ );
440}
441
442open( SLOG , ">>$SimpleLogFile" );
443$slogMsg = "[$year/$mon/$mday:$hour:$min:$sec]"
444           . " COMMAND=$hnfCommandHash[$HnsMode]"
445           . " OBJ=$hnfObjectHash[$HnsObj]"
446           . " PASSWD=$PASSWORD"
447	   . " LOOPCHK=$loopcheck";
448
449print SLOG "$slogMsg";
450
451if( $PASSWORD == 0)
452{
453    print SLOG " STATE=ERROR\n";
454    close( SLOG );
455    savelog() if( $LOGMODE != 2 ) ;
456    NgMail( $slogMsg ) if( $MAILMODE == 1 );
457    exit;
458}
459
460if( $LOGMODE == 1 )
461{
462    savelog();
463}
464
465
466#   /* CREATE �ʤ� �������ե���������� OK ����Ƥ��顢mail����ʸ */
467if( $HnsMode == 1 )
468{
469    if( $HnsFlag )
470    {
471	# ��ȥե�����˰��٤���롣
472	open( OUT , ">$mailTempFile" );
473	for( @userVar )
474	{
475	    print OUT "$_";
476	}
477	print OUT "OK\n\n" if ($HnsObj == 1);
478	HnsPrint();
479	close( OUT );
480
481	# ��ȥե����뤫�饳�ԡ����� ���롣
482	if ($NKF_USE) {
483	  system( "$nkf -e < $mailTempFile > $file" );
484	}
485	else {
486	  copy ($mailTempFile, $file);
487	}
488	unlink "$mailTempFile";
489	print SLOG " STATE=DONE\n";
490	close( SLOG );
491	OkMail ($slogMsg . "\n-- body\n" . join('', @body)) if $MAILMODE == 1;
492
493	# Update Namazu index
494	system("$MkNamazuPath") if $NamazuExecFlag == 1;
495
496	# cvs_add_commit ($file);
497	exit;
498    }
499}
500
501# /* APPEND �� */
502if( $HnsMode == 2 )
503{
504    if( $HnsFlag )
505    {
506	if(-f "$file")
507	{
508#	/* ���˥ե����뤬����ʤ� ���Τޤ� */
509	    if ($NKF_USE) {
510	      system( "$nkf -e < $file > $mailTempFile");
511	    }
512	    else {
513	      copy ($file, $mailTempFile);
514	    }
515	    system( "cp $mailTempFile $file" );
516
517	    open( OUT , ">$mailTempFile" );
518#    /* mail ����ʸ */
519	    HnsPrint();
520	    close( OUT );
521	    # ��ȥե����뤫�饳�ԡ����� ���롣
522	    if ($NKF_USE) {
523	      system( "$nkf -e < $mailTempFile >> $file" );
524	    }
525	    else {
526	      append ($mailTempFile, $file);
527	    }
528	    unlink "$mailTempFile";
529
530	}
531	else
532	{
533#	/* �ʤ��ä��� ��ä� OK ������� */
534	    # ��ȥե�����˰��٤���롣
535	    open( OUT , ">$mailTempFile" );
536	    for( @userVar )
537	    {
538		print OUT "$_";
539	    }
540	    print OUT "OK\n\n" if ($HnsObj == 1);
541#    /* mail ����ʸ */
542	    HnsPrint();
543	    close( OUT );
544	    # ��ȥե����뤫�饳�ԡ����� ���롣
545	    if ($NKF_USE) {
546	      system( "$nkf -e < $mailTempFile > $file" );
547	    }
548	    else {
549	      copy ($mailTempFile, $file);
550	    }
551	    unlink "$mailTempFile";
552
553	}
554
555	print SLOG " STATE=DONE\n";
556	close( SLOG );
557
558        OkMail ($slogMsg . "\n-- body\n" . join('', @body)) if $MAILMODE == 1;
559
560        # Update Namazu index
561        system("$MkNamazuPath") if $NamazuExecFlag == 1;
562
563        # cvs_add_commit ($file);
564	exit;
565    }
566
567}
568
569# /* DELETE �ʤ顢�ä����㤨 */
570if( $HnsMode == 3 )
571{
572    if( $HnsFlag )
573    {
574# /* �Ǥⶲ������ ���� �Τ����Ƥ����� */
575	system( "cat $file >>$backupFile" );
576	unlink "$file";
577	print SLOG " STATE=DONE\n";
578	close( SLOG );
579	OkMail( $slogMsg ) if( $MAILMODE == 1 );
580	exit;
581    }
582}
583# /* GET �ʤ� mail ������ */
584if( $HnsMode == 4 )
585{
586    if( $HnsFlag )
587    {
588
589	# �ޤ�����ȥե������ nkf -j ���롣
590	if ($NKF_USE) {
591	  system( "$nkf -j < $file > $mailTempFile" );
592	}
593	else {
594	  copy_jis ($file, $mailTempFile);
595	}
596	# ���Υե�������٤� sendmail ���롣
597
598	@mbody = ( 'This message was written by mail2nikki',
599		   'System accsept GET command',
600		  '');
601
602	open( IN , "$mailTempFile");
603	while( $_=<IN>)
604	{
605	    chomp;
606	    s/^\./\.\./;
607	    push( @mbody , $_ );
608	}
609	close( IN );
610
611##	Sendmail($sendmail , $mailAddress , $recvMailAddress ,
612	Sendmail($sendmail , $cmdGetAddress , $recvMailAddress ,
613		 "[mail2nikki] GET $file", \@mbody);
614	unlink "$mailTempFile";
615	print SLOG " STATE=DONE\n";
616	close( SLOG );
617	OkMail( $slogMsg ) if( $MAILMODE == 1 );
618	exit;
619    }
620}
621
622
623print SLOG " STATE=NO TRANSACT\n";
624close( SLOG );
625NgMail( $slogMsg ) if( $MAILMODE == 1 );
626exit;
627
628