prepare("INSERT INTO passwords (title, username, password, url, notes, owner_id) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$_POST['title'], $_POST['username'], $_POST['password'], $_POST['url'], $_POST['notes'], $user_id]); } if($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['bulk_action'])) { if(isset($_POST['selected_passwords'])) { $selected = $_POST['selected_passwords']; $action = $_POST['bulk_action']; if($action === 'delete') { foreach($selected as $p_id) { // Check if owner $p = query("SELECT owner_id FROM passwords WHERE id=?", [$p_id])->fetch(); if($p && $p['owner_id']==$user_id) { query("DELETE FROM passwords WHERE id=?", [$p_id]); } } } elseif($action === 'share') { $share_target = $_POST['share_target']; // 'user_1' $parts = explode('_', $share_target); foreach($selected as $p_id) { $p = query("SELECT owner_id, title FROM passwords WHERE id=?", [$p_id])->fetch(); if($p && $p['owner_id']==$user_id) { $stmt = $pdo->prepare("INSERT INTO password_shares (password_id, share_type, share_id) VALUES (?, ?, ?)"); $stmt->execute([$p_id, $parts[0], $parts[1]]); $msg = "A password '{$p['title']}' has been shared with you."; if($parts[0] === 'user') notify_user($parts[1], $msg); else notify_group($parts[1], $msg); } } } } } // Fetch passwords (owned + shared) $user_groups = get_user_groups($user_id); $my_group_ids = array_column($user_groups, 'id'); $group_in = implode(',', array_fill(0, count($my_group_ids), '?')) ?: '0'; $params = array_merge([$user_id, $user_id], $my_group_ids); $sql = "SELECT p.*, (p.owner_id = ?) as is_mine FROM passwords p LEFT JOIN password_shares ps ON p.id = ps.password_id WHERE p.owner_id = ? OR (ps.share_type='user' AND ps.share_id = ?) OR (ps.share_type='group' AND ps.share_id IN ($group_in)) GROUP BY p.id ORDER BY p.title"; $params = array_merge([$user_id, $user_id, $user_id], $my_group_ids); $stmt = $pdo->prepare($sql); $stmt->execute($params); $passwords = $stmt->fetchAll(); $all_users = query("SELECT id, username FROM users WHERE id != ?", [$user_id])->fetchAll(); $all_groups = query("SELECT * FROM groups")->fetchAll(); ?>