diff --git a/server.js b/server.js index d01c14a0..2fbff61f 100644 --- a/server.js +++ b/server.js @@ -2477,6 +2477,13 @@ ${excerpt} const grpCheck = await pool.query('SELECT id FROM together_groups WHERE id=$1', [group_id]); if (grpCheck.rows.length === 0) return res.status(404).json({ error: 'グループが見つかりません' }); + // グループメンバーであることを確認(非メンバーの投稿を防止) + const memberCheck = await pool.query( + 'SELECT 1 FROM together_members WHERE group_id=$1 AND username=$2', + [group_id, shared_by] + ); + if (memberCheck.rows.length === 0) return res.status(403).json({ error: 'グループのメンバーではありません' }); + const result = await pool.query( `INSERT INTO together_shares (group_id, shared_by, url, title, message, tags) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`, @@ -2498,6 +2505,7 @@ ${excerpt} const { username } = req.body || {}; if (!username) return res.status(400).json({ error: 'username は必須です' }); try { + // shared_by が一致する行のみ削除(なければ 403) const result = await pool.query( 'DELETE FROM together_shares WHERE id=$1 AND shared_by=$2 RETURNING id', [req.params.id, username] @@ -2556,6 +2564,13 @@ ${excerpt} if (!share_id || !username) return res.status(400).json({ error: 'share_id と username は必須です' }); if (!['like', 'star', 'fire'].includes(type)) return res.status(400).json({ error: 'type は like/star/fire のみ有効です' }); try { + // share の group に対してメンバーであることを確認 + const memberCheck = await pool.query( + 'SELECT 1 FROM together_members m JOIN together_shares s ON s.group_id=m.group_id WHERE s.id=$1 AND m.username=$2', + [share_id, username] + ); + if (memberCheck.rows.length === 0) return res.status(403).json({ error: 'グループのメンバーではありません' }); + const existing = await pool.query( 'SELECT 1 FROM together_reactions WHERE share_id=$1 AND username=$2 AND type=$3', [share_id, username, type] @@ -2599,6 +2614,13 @@ ${excerpt} return res.status(400).json({ error: 'share_id, username, body は必須です' }); } try { + // share の group に対してメンバーであることを確認 + const memberCheck = await pool.query( + 'SELECT 1 FROM together_members m JOIN together_shares s ON s.group_id=m.group_id WHERE s.id=$1 AND m.username=$2', + [share_id, username] + ); + if (memberCheck.rows.length === 0) return res.status(403).json({ error: 'グループのメンバーではありません' }); + const result = await pool.query( 'INSERT INTO together_comments (share_id, username, body) VALUES ($1, $2, $3) RETURNING *', [share_id, username, body.trim()]