ここの情報は古いです。ご理解頂いた上でお取り扱いください。

source: OpenPNE/branches/work/ogawa/renew_OpenPNE_Auth/webapp/lib/mail/sns.php @ 6963

Last change on this file since 6963 was 6963, checked in by ogawa, 12 years ago

merged stable-2.12.x

File size: 22.8 KB
Line 
1<?php
2/**
3 * @copyright 2005-2008 OpenPNE Project
4 * @license   http://www.php.net/license/3_01.txt PHP License 3.01
5 */
6
7class mail_sns
8{
9    var $decoder;
10    var $from;
11    var $to;
12
13    var $c_member_id;
14
15    function mail_sns(&$decoder)
16    {
17        $this->decoder =& $decoder;
18        $this->from = $decoder->get_from();
19        $this->to = $decoder->get_to();
20
21        $this->c_member_id = db_member_c_member_id4ktai_address2($this->from);
22
23        // メンバーIDが見つからない場合は、ローカルパートに二重引用符を付加してリトライ
24        if (!$this->c_member_id) {
25            list($local, $domain) = explode('@', $this->from, 2);
26            $this->c_member_id = db_member_c_member_id4ktai_address2('"' . $local . '"' . '@' . $domain);
27        }
28    }
29
30    function main()
31    {
32        $matches = array();
33        list($from_user, $from_host) = explode('@', $this->from, 2);
34        list($to_user, $to_host) = explode('@', $this->to, 2);
35
36        // メンテナンスモード
37        if (OPENPNE_UNDER_MAINTENANCE) {
38            $this->error_mail('現在メンテナンス中のため、メール投稿はおこなえません。しばらく時間を空けて再度送信してください。');
39            m_debug_log('mail_sns::main() maintenance mode');
40            return false;
41        }
42
43        // from_host が携帯ドメイン以外はエラー
44        if (!is_ktai_mail_address($this->from)) {
45            m_debug_log('mail_sns::main() from wrong host');
46            return false;
47        }
48
49        if (MAIL_ADDRESS_PREFIX) {
50            if (strpos($to_user, MAIL_ADDRESS_PREFIX) === 0) {
51                $to_user = substr($to_user, strlen(MAIL_ADDRESS_PREFIX));
52            }
53        }
54
55        if (!$this->c_member_id) {
56            // 送信者がSNSメンバーでない場合
57
58            if (!IS_CLOSED_SNS) {
59                // get 新規登録
60                if ($to_user == 'get') {
61                    // アフィリエイトIDが付いている場合
62                    $body = $this->decoder->get_text_body();
63
64                    m_debug_log('mail_sns::regist_get()', PEAR_LOG_INFO);
65                    return $this->regist_get($body);
66                }
67            }
68
69            m_debug_log('mail_sns::main() action not found');
70            return false;
71        }
72
73        //---
74
75        // ログインURL通知
76        if ($to_user == 'get') {
77            m_debug_log('mail_sns::login_get()', PEAR_LOG_INFO);
78            return $this->login_get();
79        }
80
81        //---
82
83        // コミュニティ掲示板投稿
84        elseif (
85            preg_match('/^t(\d+)$/', $to_user, $matches) ||
86            preg_match('/^t(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
87        ) {
88
89            // トピックIDのチェック
90            if (!$c_commu_topic_id = $matches[1]) {
91                return false;
92            }
93
94            if (MAIL_ADDRESS_HASHED) {
95                if (empty($matches[2])) return false;
96
97                // メンバーハッシュのチェック
98                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
99                    return false;
100                }
101            }
102
103            m_debug_log('mail_sns::add_commu_topic_comment()', PEAR_LOG_INFO);
104            return $this->add_commu_topic_comment($c_commu_topic_id);
105        }
106
107        //---
108
109        // 日記投稿
110        elseif (
111            $to_user == 'blog' ||
112            preg_match('/^b(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
113        ) {
114
115            if (MAIL_ADDRESS_HASHED) {
116                if (empty($matches[1]) || empty($matches[2])) return false;
117
118                // メンバーIDのチェック
119                if ($matches[1] != $this->c_member_id) {
120                    return false;
121                }
122                // メンバーハッシュのチェック
123                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
124                    return false;
125                }
126            }
127
128            m_debug_log('mail_sns::add_diary()', PEAR_LOG_INFO);
129            return $this->add_diary();
130        }
131
132        //---
133
134        // 日記コメント投稿
135        elseif (
136            preg_match('/^bc(\d+)$/', $to_user, $matches) ||
137            preg_match('/^bc(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
138        ) {
139
140            // 日記IDのチェック
141            if (!$c_diary_id = $matches[1]) {
142                return false;
143            }
144
145            if (MAIL_ADDRESS_HASHED) {
146                if (empty($matches[2])) return false;
147
148                // メンバーハッシュのチェック
149                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
150                    return false;
151                }
152            }
153
154            m_debug_log('mail_sns::add_diary_comment()', PEAR_LOG_INFO);
155            return $this->add_diary_comment($c_diary_id);
156        }
157
158        //---
159
160        //プロフィール写真変更
161        elseif (
162            preg_match('/^p(\d+)$/', $to_user, $matches) ||
163            preg_match('/^p(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
164        ) {
165
166            // メンバーIDのチェック
167            if ($matches[1] != $this->c_member_id) {
168                return false;
169            }
170
171            if (MAIL_ADDRESS_HASHED) {
172                if (empty($matches[2])) return false;
173
174                // メンバーハッシュのチェック
175                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
176                    return false;
177                }
178            }
179
180            m_debug_log('mail_sns::add_member_image()', PEAR_LOG_INFO);
181            return $this->add_member_image();
182        }
183
184        //---
185
186        // 日記写真変更
187        elseif (
188            preg_match('/^bi(\d+)$/', $to_user, $matches) ||
189            preg_match('/^bi(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
190        ) {
191            // 日記IDのチェック
192            if (!$c_diary_id = $matches[1]) {
193                return false;
194            }
195
196            if (MAIL_ADDRESS_HASHED) {
197                if (empty($matches[2])) return false;
198
199                // メンバーハッシュのチェック
200                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
201                    return false;
202                }
203            }
204
205            m_debug_log('mail_sns::add_diary_image()', PEAR_LOG_INFO);
206            return $this->add_diary_image($c_diary_id);
207        }
208
209        //---
210
211        // コミュニティ写真変更
212        elseif (
213            preg_match('/^ci(\d+)$/', $to_user, $matches) ||
214            preg_match('/^ci(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
215        ) {
216            // コミュニティIDのチェック
217            if (!$c_commu_id = $matches[1]) {
218                return false;
219            }
220
221            if (MAIL_ADDRESS_HASHED) {
222                if (empty($matches[2])) return false;
223
224                // メンバーハッシュのチェック
225                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
226                    return false;
227                }
228            }
229
230            m_debug_log('mail_sns::add_commu_image()', PEAR_LOG_INFO);
231            return $this->add_commu_image($c_commu_id);
232        }
233
234        //---
235
236        // トピック・イベント写真変更
237        elseif (
238            preg_match('/^ti(\d+)$/', $to_user, $matches) ||
239            preg_match('/^ti(\d+)-([0-9a-f]{12})$/', $to_user, $matches)
240        ) {
241            // トピックIDのチェック
242            if (!$c_commu_topic_id = $matches[1]) {
243                return false;
244            }
245
246            if (MAIL_ADDRESS_HASHED) {
247                if (empty($matches[2])) return false;
248
249                // メンバーハッシュのチェック
250                if ($matches[2] != t_get_user_hash($this->c_member_id)) {
251                    return false;
252                }
253            }
254
255            m_debug_log('mail_sns::add_topic_image()', PEAR_LOG_INFO);
256            return $this->add_topic_image($c_commu_topic_id);
257        }
258
259        m_debug_log('mail_sns::main() action not found(member)');
260        return false;
261    }
262
263    /**
264     * 新規登録のURL取得
265     */
266    function regist_get($aff_id)
267    {
268        // 招待者は c_member_id = 1 (固定)
269        $c_member_id_invite = 1;
270
271        // _pre に追加
272        $session = create_hash();
273        db_member_insert_c_member_ktai_pre($session, $this->from, $c_member_id_invite);
274
275        do_common_send_mail_regist_get($session, $this->from, $aff_id);
276        return true;
277    }
278
279    /**
280     * ログインページのURL取得
281     */
282    function login_get()
283    {
284        do_mail_sns_login_get_mail_send($this->c_member_id, $this->from);
285        return true;
286    }
287
288    /**
289     * コミュニティ掲示板投稿
290     */
291    function add_commu_topic_comment($c_commu_topic_id)
292    {
293        if (!$topic = db_commu_c_commu_topic4c_commu_topic_id_3($c_commu_topic_id)) {
294            return false;
295        }
296
297        $c_commu_id = $topic['c_commu_id'];
298        if (!db_commu_is_c_commu_member($c_commu_id, $this->c_member_id)) {
299            $this->error_mail(WORD_COMMUNITY . 'に参加していないため投稿できませんでした。');
300            m_debug_log('mail_sns::add_commu_topic_comment() not a member');
301            return false;
302        }
303
304        $images = $this->decoder->get_images();
305        if ($images === false) {
306            $this->error_mail('画像は' . IMAGE_MAX_FILESIZE . 'KB以内のGIF・JPEG・PNGにしてください。');
307            return false;
308        }
309
310        $body = $this->decoder->get_text_body();
311        if ($body === '') {
312            $this->error_mail('本文が空のため投稿できませんでした。');
313            m_debug_log('mail_sns::add_commu_topic_comment() body is empty');
314            return false;
315        }
316
317        // 書き込みをDBに追加
318        $ins_id = db_commu_insert_c_commu_topic_comment($c_commu_id, $topic['c_commu_topic_id'], $this->c_member_id, $body);
319
320        // 写真登録
321        $image_num = 1;
322        foreach ($images as $image) {
323            $image_ext = $image['ext'];
324            $image_data = $image['data'];
325            $filename = 'tc_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
326
327            db_image_insert_c_image($filename, $image_data);
328            db_commu_update_c_commu_topic_comment_image($ins_id, $filename, $image_num);
329            $image_num++;
330            if ($image_num > 3) {
331                break;
332            }
333        }
334
335        //お知らせメール送信(携帯へ)
336        send_bbs_info_mail($ins_id, $this->c_member_id);
337        //お知らせメール送信(PCへ)
338        send_bbs_info_mail_pc($ins_id, $this->c_member_id);
339
340        if (OPENPNE_USE_POINT_RANK) {
341            //トピック・イベントにコメントした人にポイント付与
342            $point = db_action_get_point4c_action_id(11);
343            db_point_add_point($this->c_member_id, $point);
344        }
345
346        return true;
347    }
348
349    /**
350     * 日記投稿
351     */
352    function add_diary()
353    {
354        $subject = $this->decoder->get_subject();
355        $body    = $this->decoder->get_text_body();
356
357        if ($subject === '') {
358            $subject = '無題';
359        }
360        if ($body === '') {
361            $this->error_mail('本文が空のため投稿できませんでした');
362            m_debug_log('mail_sns::add_diary() body is empty');
363            return false;
364        }
365
366        $images = $this->decoder->get_images();
367        if ($images === false) {
368            $this->error_mail('画像は' . IMAGE_MAX_FILESIZE . 'KB以内のGIF・JPEG・PNGにしてください。');
369            return false;
370        }
371
372        $c_member = db_common_c_member4c_member_id($this->c_member_id);
373        if (!$ins_id = db_diary_insert_c_diary($this->c_member_id, $subject, $body, $c_member['public_flag_diary'])) {
374            return false;
375        }
376
377        // 写真登録
378        $image_num = 1;
379        foreach ($images as $image) {
380            $image_ext = $image['ext'];
381            $image_data = $image['data'];
382            $filename = 'd_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
383
384            db_image_insert_c_image($filename, $image_data);
385            db_diary_update_c_diary_image_filename($ins_id, $filename, $image_num);
386            $image_num++;
387            if ($image_num > 3) {
388                break;
389            }
390        }
391
392        if (OPENPNE_USE_POINT_RANK) {
393            //日記を書いた人にポイント付与
394            $point = db_action_get_point4c_action_id(4);
395            db_point_add_point($this->c_member_id, $point);
396        }
397
398        return true;
399    }
400
401    /**
402     * 日記コメント投稿
403     */
404    function add_diary_comment($c_diary_id)
405    {
406        //--- 権限チェック
407
408        $c_diary = db_diary_get_c_diary4id($c_diary_id);
409        $target_c_member_id = $c_diary['c_member_id'];
410        $target_c_member = db_member_c_member4c_member_id($target_c_member_id);
411
412        if ($this->c_member_id != $target_c_member_id) {
413            // check public_flag
414            if (!pne_check_diary_public_flag($c_diary_id, $this->c_member_id)) {
415                $this->error_mail(WORD_DIARY . 'にアクセスできないため投稿できませんでした。');
416                m_debug_log('mail_sns::add_diary_comment() not a member');
417                return false;
418            }
419            //アクセスブロック設定
420            if (db_member_is_access_block($this->c_member_id, $target_c_member_id)) {
421                $this->error_mail(WORD_DIARY . 'にアクセスできないため投稿できませんでした。');
422                m_debug_log('mail_sns::add_diary_comment() access block');
423                return false;
424            }
425        }
426        //---
427
428        $body = $this->decoder->get_text_body();
429        if ($body === '') {
430            $this->error_mail('本文が空のため投稿できませんでした。');
431            m_debug_log('mail_sns::add_diary_comment() body is empty');
432            return false;
433        }
434
435        //日記コメント書き込み
436        $ins_id = db_diary_insert_c_diary_comment($this->c_member_id, $c_diary_id, $body);
437
438        //日記コメント記入履歴追加
439        if ($u != $target_c_member_id) {
440            db_diary_insert_c_diary_comment_log($u, $target_c_diary_id);
441        }
442        //日記コメント記入履歴更新
443        db_diary_update_c_diary_comment_log($target_c_diary_id);
444
445        // 写真登録
446        $images = $this->decoder->get_images();
447        $image_num = 1;
448        $filenames = array(1 => '', 2 => '', 3 => '');
449        foreach ($images as $image) {
450            $image_ext = $image['ext'];
451            $image_data = $image['data'];
452            $filename = 'dc_' . $ins_id . '_' . $image_num . '_' . time() . '.' . $image_ext;
453
454            db_image_insert_c_image($filename, $image_data);
455            $filenames[$image_num] = $filename;
456            $image_num++;
457            if ($image_num > 3) {
458                break;
459            }
460        }
461        db_diary_insert_c_diary_comment_images($ins_id, $filenames[1], $filenames[2], $filenames[3]);
462
463        //お知らせメール送信(携帯へ)
464        if ($this->c_member_id != $target_c_member_id) {
465            send_diary_comment_info_mail($ins_id, $this->c_member_id);
466        }
467
468        //日記コメントが書き込まれたので日記自体を未読扱いにする
469        if ($this->c_member_id != $target_c_member_id) {
470            db_diary_update_c_diary_is_checked($c_diary_id, 0);
471        }
472
473        if (OPENPNE_USE_POINT_RANK) {
474            // コメント者と被コメント者が違う場合にポイント加算
475            if ($this->c_member_id != $target_c_member_id) {
476                //書いた人にポイント付与
477                $point = db_action_get_point4c_action_id(3);
478                db_point_add_point($this->c_member_id, $point);
479
480                //書かれた人にポイント付与
481                $point = db_action_get_point4c_action_id(2);
482                db_point_add_point($target_c_member_id, $point);
483            }
484        }
485
486        return true;
487    }
488
489    /**
490     * プロフィール写真変更
491     */
492    function add_member_image()
493    {
494        $c_member = db_member_c_member4c_member_id($this->c_member_id);
495
496        // 登録する写真番号(1-3)を決める
497        $target_number = 0;
498        if ($c_member['image_filename']) {
499            if (!$c_member['image_filename_1']) {
500                $target_number = 1;
501            } elseif (!$c_member['image_filename_2']) {
502                $target_number = 2;
503            } elseif (!$c_member['image_filename_3']) {
504                $target_number = 3;
505            } else {
506                $this->error_mail('プロフィール写真の登録は最大3枚までです。');
507                m_debug_log('mail_sns::add_diary() image is full');
508                return false;
509            }
510        } else {
511            $target_number = 1;
512        }
513
514        // 写真登録
515        if ($images = $this->decoder->get_images()) {
516            $image = $images[0];
517            $image_ext = $image['ext'];
518            $image_data = $image['data'];
519            $filename = 'm_' . $this->c_member_id . '_' . time() . '.' . $image_ext;
520
521            db_image_insert_c_image($filename, $image_data);
522            db_member_update_c_member_image($this->c_member_id, $filename, $target_number);
523            return true;
524        } else {
525            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
526            m_debug_log('mail_sns::add_member_image() no images');
527            return false;
528        }
529    }
530
531    /**
532     * 日記写真変更
533     */
534    function add_diary_image($c_diary_id)
535    {
536        if (!$c_diary = db_diary_get_c_diary4id($c_diary_id)) {
537            return false;
538        }
539
540        if ($c_diary['c_member_id'] != $this->c_member_id) {
541            return false;
542        }
543
544        // 登録する写真番号(1-3)を決める
545        $target_number = 0;
546        if ($c_diary['image_filename_1'] || $c_diary['image_filename_2'] || $c_diary['image_filename_3']) {
547            if (!$c_diary['image_filename_1']) {
548                $target_number = 1;
549            } elseif (!$c_diary['image_filename_2']) {
550                $target_number = 2;
551            } elseif (!$c_diary['image_filename_3']) {
552                $target_number = 3;
553            } else {
554                $this->error_mail(WORD_DIARY . '写真の登録は最大3枚までです。');
555                m_debug_log('mail_sns::add_diary_image() image is full');
556                return false;
557            }
558        } else {
559            $target_number = 1;
560        }
561
562        // 写真登録
563        if ($images = $this->decoder->get_images()) {
564            $image = $images[0];
565            $image_ext = $image['ext'];
566            $image_data = $image['data'];
567            $filename = 'd_' . $c_diary_id . '_' . $target_number . '_' . time() . '.' . $image_ext;
568            db_image_insert_c_image($filename, $image_data);
569            db_diary_update_c_diary_image_filename($c_diary_id, $filename, $target_number);
570            return true;
571        } else {
572            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
573            m_debug_log('mail_sns::add_diary_image() no images');
574            return false;
575        }
576    }
577
578    /**
579     * コミュニティ写真変更
580     */
581    function add_commu_image($c_commu_id)
582    {
583        if (!$c_commu = db_commu_c_commu4c_commu_id($c_commu_id)) {
584            return false;
585        }
586
587        if ($c_commu['c_member_id_admin'] != $this->c_member_id && $c_commu['c_member_id_sub_admin'] != $this->c_member_id ) {
588            return false;
589        }
590
591        if ($c_commu['image_filename']) {
592            $this->error_mail(WORD_COMMUNITY . '写真の登録は最大1枚までです。');
593            m_debug_log('mail_sns::add_commu_image() image is full');
594            return false;
595        }
596
597        // 写真登録
598        if ($images = $this->decoder->get_images()) {
599            $image = $images[0];
600            $image_ext = $image['ext'];
601            $image_data = $image['data'];
602            $filename = 'c_' . $c_commu_id . '_' .  time() . '.' . $image_ext;
603            db_image_insert_c_image($filename, $image_data);
604            db_commu_update_c_commu_image_filename($c_commu_id, $filename);
605            return true;
606        } else {
607            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
608            m_debug_log('mail_sns::add_commu_image() no images');
609            return false;
610        }
611    }
612
613    /**
614     * トピック・イベント写真変更
615     */
616    function add_topic_image($c_commu_topic_id)
617    {
618        if (!$c_topic = db_commu_c_topic4c_commu_topic_id($c_commu_topic_id)) {
619            return false;
620        }
621
622        $c_commu_id = $c_topic['c_commu_id'];
623
624        if (!db_commu_is_c_topic_admin($c_commu_topic_id, $this->c_member_id) &&
625            !db_commu_is_c_commu_admin($c_commu_id, $this->c_member_id)) {
626            return false;
627        }
628
629        // 登録する写真番号(1-3)を決める
630        $target_number = 0;
631        if ($c_topic['image_filename1'] || $c_topic['image_filename2'] || $c_topic['image_filename3']) {
632            if (!$c_topic['image_filename1']) {
633                $target_number = 1;
634            } elseif (!$c_topic['image_filename2']) {
635                $target_number = 2;
636            } elseif (!$c_topic['image_filename3']) {
637                $target_number = 3;
638            } else {
639                $this->error_mail('トピック・イベント写真の登録は最大3枚までです。');
640                m_debug_log('mail_sns::add_topic_image() image is full');
641                return false;
642            }
643        } else {
644            $target_number = 1;
645        }
646
647        // 写真登録
648        if ($images = $this->decoder->get_images()) {
649            $image = $images[0];
650            $image_ext = $image['ext'];
651            $image_data = $image['data'];
652            $filename = 't_' . $c_commu_topic_id . '_' . $target_number . '_' . time() . '.' . $image_ext;
653
654            $c_topic['image_filename' . $target_number] = $filename;
655            db_image_insert_c_image($filename, $image_data);
656            db_commu_update_c_commu_topic_comment_images($c_topic['c_commu_topic_comment_id'], $c_topic['image_filename1'], $c_topic['image_filename2'], $c_topic['image_filename3']);
657            return true;
658        } else {
659            $this->error_mail('写真が添付されていないか、ファイルサイズが大きすぎるため、登録できませんでした。');
660            m_debug_log('mail_sns::add_topic_image() no images');
661            return false;
662        }
663
664    }
665
666    /**
667     * エラーメールをメール送信者へ返信
668     */
669    function error_mail($body)
670    {
671        $subject = '['.SNS_NAME.']メール投稿エラー';
672        t_send_email($this->from, $subject, $body);
673    }
674}
675
676?>
Note: See TracBrowser for help on using the repository browser.