fix: Together API に投稿前グループメンバー確認を追加
/together/share, /together/react, /together/comments の各書き込みエンドポイントに together_members テーブルでのメンバーチェックを追加。 非メンバーによる投稿・リアクション・コメントを 403 で拒否する。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
10402464c5
commit
47c75cae4f
22
server.js
22
server.js
|
|
@ -2477,6 +2477,13 @@ ${excerpt}
|
||||||
const grpCheck = await pool.query('SELECT id FROM together_groups WHERE id=$1', [group_id]);
|
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: 'グループが見つかりません' });
|
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(
|
const result = await pool.query(
|
||||||
`INSERT INTO together_shares (group_id, shared_by, url, title, message, tags)
|
`INSERT INTO together_shares (group_id, shared_by, url, title, message, tags)
|
||||||
VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`,
|
VALUES ($1, $2, $3, $4, $5, $6) RETURNING *`,
|
||||||
|
|
@ -2498,6 +2505,7 @@ ${excerpt}
|
||||||
const { username } = req.body || {};
|
const { username } = req.body || {};
|
||||||
if (!username) return res.status(400).json({ error: 'username は必須です' });
|
if (!username) return res.status(400).json({ error: 'username は必須です' });
|
||||||
try {
|
try {
|
||||||
|
// shared_by が一致する行のみ削除(なければ 403)
|
||||||
const result = await pool.query(
|
const result = await pool.query(
|
||||||
'DELETE FROM together_shares WHERE id=$1 AND shared_by=$2 RETURNING id',
|
'DELETE FROM together_shares WHERE id=$1 AND shared_by=$2 RETURNING id',
|
||||||
[req.params.id, username]
|
[req.params.id, username]
|
||||||
|
|
@ -2556,6 +2564,13 @@ ${excerpt}
|
||||||
if (!share_id || !username) return res.status(400).json({ error: 'share_id と username は必須です' });
|
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 のみ有効です' });
|
if (!['like', 'star', 'fire'].includes(type)) return res.status(400).json({ error: 'type は like/star/fire のみ有効です' });
|
||||||
try {
|
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(
|
const existing = await pool.query(
|
||||||
'SELECT 1 FROM together_reactions WHERE share_id=$1 AND username=$2 AND type=$3',
|
'SELECT 1 FROM together_reactions WHERE share_id=$1 AND username=$2 AND type=$3',
|
||||||
[share_id, username, type]
|
[share_id, username, type]
|
||||||
|
|
@ -2599,6 +2614,13 @@ ${excerpt}
|
||||||
return res.status(400).json({ error: 'share_id, username, body は必須です' });
|
return res.status(400).json({ error: 'share_id, username, body は必須です' });
|
||||||
}
|
}
|
||||||
try {
|
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(
|
const result = await pool.query(
|
||||||
'INSERT INTO together_comments (share_id, username, body) VALUES ($1, $2, $3) RETURNING *',
|
'INSERT INTO together_comments (share_id, username, body) VALUES ($1, $2, $3) RETURNING *',
|
||||||
[share_id, username, body.trim()]
|
[share_id, username, body.trim()]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue