2021-12-02 01:27:34 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Home;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
2021-12-03 12:25:31 +09:00
|
|
|
use App\Http\Controllers\MailerController;
|
2021-12-02 01:27:34 +09:00
|
|
|
use App\Mail\ContactNotifyMail;
|
|
|
|
|
|
|
|
class Contact {
|
|
|
|
private $field;
|
|
|
|
|
|
|
|
public function __construct () {
|
|
|
|
$this->field = [
|
|
|
|
'kenmei' => '',
|
|
|
|
'adr' => '',
|
|
|
|
'cat' => '',
|
|
|
|
'cats' => [
|
|
|
|
'' => '',
|
|
|
|
'bugreport' => 'バグ報告したい',
|
|
|
|
'chat' => 'チャットサービス(XMPP、IRC、Mumble)について聞きたい',
|
|
|
|
'social' => 'SNSサービス(Pleroma、PeerTube)について聞きたい',
|
|
|
|
'privfront' => '代替SNSフロントサービス(Nitter、Invidious、Librarian、Searx)について聞きたい',
|
|
|
|
'storage' => 'ストレージサービス(Gitea、Nextcloud)について聞きたい',
|
|
|
|
'otherserv' => '076外サービス(テク諏訪、076萌、URLoli、some.very.questionable.website、hozon.site、xmr.jp等)について聞きたい',
|
|
|
|
'scam1' => 'DMCA報告したい',
|
|
|
|
'scam2' => '営業したい',
|
|
|
|
'scam3' => '法律について',
|
|
|
|
'scam4' => '税金について',
|
|
|
|
'scam5' => '無駄な話',
|
|
|
|
],
|
|
|
|
'bunsyo' => '',
|
|
|
|
'gpg' => '',
|
|
|
|
'ruleapply' => false,
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function index (Request $r) {
|
|
|
|
if (isset($r->submit)) return $this->send($r);
|
|
|
|
return view('pages.site.contact', ['field' => $this->field, 'err' => []]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function seiko () {
|
|
|
|
return view('pages.site.contact-seiko', ['field' => $this->field, 'suc' => ['メールを送りました!', '送信者様は連絡ルールを守ったら、24時間以内で返事します。']]);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function send (Request $r) {
|
|
|
|
$this->field['adr'] = $r->adr;
|
|
|
|
$this->field['kenmei'] = $r->kenmei;
|
|
|
|
$this->field['cat'] = $r->cat;
|
2021-12-03 12:25:31 +09:00
|
|
|
$this->field['catname'] = $r->cat;
|
2021-12-02 01:27:34 +09:00
|
|
|
$this->field['gpg'] = !isset($r->gpg) || is_null($r->gpg) || $r->gpg == '' ? null : file_get_contents($r->file('gpg'));
|
|
|
|
$this->field['bunsyo'] = $r->bunsyo;
|
|
|
|
$this->field['ruleapply'] = isset($r->ruleapply);
|
|
|
|
|
|
|
|
$err = [];
|
|
|
|
$gpg = null;
|
|
|
|
|
|
|
|
// メールアドレス
|
|
|
|
if (!isset($this->field['adr']) || is_null($this->field['adr']) || $this->field['adr'] == '') $err[] = 'メールアドレスをご入力下さい。';
|
|
|
|
else if (!filter_var($this->field['adr'], FILTER_VALIDATE_EMAIL)) $err[] = 'メールアドレスを正しくご入力下さい。';
|
2021-12-03 12:25:31 +09:00
|
|
|
$this->field['filename'] = trim($this->field['adr']).'.key';
|
2021-12-02 01:27:34 +09:00
|
|
|
|
|
|
|
// 件名
|
|
|
|
if (!isset($this->field['kenmei']) || is_null($this->field['kenmei']) || $this->field['kenmei'] == '') $err[] = '件名をご入力下さい。';
|
|
|
|
if (str_contains($this->field['kenmei'], 'http://') || str_contains($this->field['kenmei'], 'https://')) $err[] = '件名でURLを入らないで下さい。';
|
|
|
|
$this->field['bunsyo'] = trim($this->field['bunsyo']);
|
|
|
|
|
|
|
|
// カテゴリ
|
|
|
|
if (!isset($this->field['cat']) || is_null($this->field['cat']) || $this->field['cat'] == '') $err[] = 'カテゴリをご選択下さい。';
|
|
|
|
|
|
|
|
// GPG
|
|
|
|
if (!isset($this->field['gpg']) || is_null($this->field['gpg']) || $this->field['gpg'] == '') $err[] = 'GPGをご選択下さい。';
|
|
|
|
else {
|
|
|
|
$gpg = new \gnupg();
|
|
|
|
$info = $gpg->import($this->field['gpg']);
|
|
|
|
$gpg->addencryptkey($info['fingerprint']);
|
2021-12-03 12:25:31 +09:00
|
|
|
Storage::disk('public')->put($this->field['filename'], $this->field['gpg']);
|
|
|
|
$path = Storage::disk('public')->path($this->field['filename']);
|
2021-12-02 01:27:34 +09:00
|
|
|
$verifygpg = explode("\n", $this->run('gpg --dry-run --import '.$path))[0];
|
2021-12-02 03:11:19 +09:00
|
|
|
if (!str_contains($verifygpg, '処理数の合計: 1') && !str_contains($verifygpg, 'Total number processed: 1')) $err[] = $verifygpg;
|
2021-12-02 01:27:34 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
// 文章
|
|
|
|
if (!isset($this->field['bunsyo']) || is_null($this->field['bunsyo']) || $this->field['bunsyo'] == '') $err[] = '文章をご入力下さい。';
|
|
|
|
if (str_contains($this->field['bunsyo'], 'http://') || str_contains($this->field['bunsyo'], 'https://')) $err[] = '文章でURLを入らないで下さい。';
|
2021-12-03 14:30:34 +09:00
|
|
|
if (isset($this->field['gpg']) && !is_null($this->field['gpg']) && $this->field['gpg'] != '') $this->field['bunsyo'] = $gpg->encrypt(trim("メール: ".$this->field['adr']."\n\n".$this->field['bunsyo']));
|
2021-12-02 01:27:34 +09:00
|
|
|
|
|
|
|
// 連絡ルール
|
|
|
|
if (!$this->field['ruleapply']) $err[] = 'ルールを同意して下さい。';
|
|
|
|
|
|
|
|
if (!empty($err)) {
|
2021-12-03 14:30:34 +09:00
|
|
|
if (isset($this->field['gpg']) && !is_null($this->field['gpg']) && $this->field['gpg'] != '') {
|
|
|
|
Storage::disk('public')->delete($this->field['filename']);
|
|
|
|
$this->field['bunsyo'] = $r->bunsyo;
|
|
|
|
}
|
2021-12-02 01:27:34 +09:00
|
|
|
return view('pages.site.contact', ['field' => $this->field, 'err' => $err]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// カテゴリはDMCA報告、営業、税金、法律、又は無駄な話を選択したら、いつでも送信せず失敗します。
|
|
|
|
if (str_contains($this->field['cat'], 'scam')) {
|
2021-12-03 14:30:34 +09:00
|
|
|
if (isset($this->field['gpg']) && !is_null($this->field['gpg']) && $this->field['gpg'] != '') {
|
|
|
|
Storage::disk('public')->delete($this->field['filename']);
|
|
|
|
$this->field['bunsyo'] = $r->bunsyo;
|
|
|
|
}
|
2021-12-02 01:27:34 +09:00
|
|
|
return view('pages.site.contact', ['field' => $this->field, 'err' => ['送信に失敗しました。数時間後もう一回送信してみて下さい。']]);
|
|
|
|
}
|
|
|
|
|
2021-12-03 12:25:31 +09:00
|
|
|
foreach ($this->field['cats'] as $i => $c) {
|
|
|
|
if ($this->field['cat'] == $i) $this->field['catname'] = $c;
|
|
|
|
}
|
|
|
|
|
2021-12-02 01:27:34 +09:00
|
|
|
// メールを送る
|
|
|
|
try {
|
2021-12-03 12:25:31 +09:00
|
|
|
$mail = new MailerController();
|
2021-12-03 13:17:29 +09:00
|
|
|
if (!$mail->compose($this->field, true)) {
|
2021-12-03 14:30:34 +09:00
|
|
|
if (isset($this->field['gpg']) && !is_null($this->field['gpg']) && $this->field['gpg'] != '') {
|
|
|
|
Storage::disk('public')->delete($this->field['filename']);
|
|
|
|
$this->field['bunsyo'] = $r->bunsyo;
|
|
|
|
}
|
2021-12-03 12:25:31 +09:00
|
|
|
return view('pages.site.contact', ['field' => $this->field, 'err' => ['送信に失敗しました。数時間後もう一回送信してみて下さい。']]);
|
|
|
|
}
|
2021-12-02 01:27:34 +09:00
|
|
|
} catch (\Throwable $e) {
|
2021-12-03 14:30:34 +09:00
|
|
|
if (isset($this->field['gpg']) && !is_null($this->field['gpg']) && $this->field['gpg'] != '') {
|
|
|
|
Storage::disk('public')->delete($this->field['filename']);
|
|
|
|
$this->field['bunsyo'] = $r->bunsyo;
|
|
|
|
}
|
2021-12-02 01:27:34 +09:00
|
|
|
Log::critical($e);
|
|
|
|
return view('pages.site.contact', ['field' => $this->field, 'err' => ['送信に失敗しました。数時間後もう一回送信してみて下さい。']]);
|
|
|
|
}
|
|
|
|
|
2021-12-03 12:25:31 +09:00
|
|
|
Storage::disk('public')->delete($this->field['filename']);
|
2021-12-02 01:27:34 +09:00
|
|
|
$this->field['kenmei'] = '';
|
|
|
|
$this->field['adr'] = '';
|
|
|
|
$this->field['cat'] = '';
|
|
|
|
$this->field['bunsyo'] = '';
|
|
|
|
$this->field['gpg'] = '';
|
|
|
|
$this->field['ruleapply'] = false;
|
|
|
|
|
|
|
|
return redirect('/contact/seiko');
|
|
|
|
}
|
|
|
|
|
|
|
|
function run ($bin, $command = '', $force = true) {
|
|
|
|
$stream = null;
|
|
|
|
$bin .= $force ? ' 2>&1' : '';
|
|
|
|
|
|
|
|
$descriptorSpec = array(
|
|
|
|
0 => array('pipe', 'r'),
|
|
|
|
1 => array('pipe', 'w')
|
|
|
|
);
|
|
|
|
|
|
|
|
$process = proc_open($bin, $descriptorSpec, $pipes);
|
|
|
|
|
|
|
|
if (is_resource($process)) {
|
|
|
|
fwrite($pipes[0], $command);
|
|
|
|
fclose($pipes[0]);
|
|
|
|
|
|
|
|
$stream = stream_get_contents($pipes[1]);
|
|
|
|
fclose($pipes[1]);
|
|
|
|
|
|
|
|
proc_close($process);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $stream;
|
|
|
|
}
|
|
|
|
}
|