Skip to content

Commit

Permalink
Merge pull request #174 from r00tat/bugfix/auth
Browse files Browse the repository at this point in the history
Fehlerbehebung Berechtigungen für subitems eines Einsatzes
  • Loading branch information
r00tat authored Oct 22, 2024
2 parents 43cff43 + 70592e3 commit db3260b
Show file tree
Hide file tree
Showing 15 changed files with 215 additions and 163 deletions.
13 changes: 11 additions & 2 deletions firebase/dev/firestore.rules
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,19 @@ service cloud.firestore {
allow read: if authorizedUser()
}

match /call/{doc=**} {
match /call/{doc} {
allow read, write: if authorizedUser()
// && resource.data.group in get(/databases/$(database)/documents/user/$(request.auth.uid)).data.groups
&& resource.data.group in request.auth.token.groups
&& resource.data.group in request.auth.token.groups;

function callAuthorized() {
return authorizedUser() && get(/databases/$(database)/documents/call/$(doc)).data.group in request.auth.token.groups
}

match /{subitem=**} {
allow read, write: if callAuthorized()
}

}

match /clusters/{doc=**} {
Expand Down
13 changes: 11 additions & 2 deletions firebase/prod/firestore.rules
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,19 @@ service cloud.firestore {
allow read: if authorizedUser()
}

match /call/{doc=**} {
match /call/{doc} {
allow read, write: if authorizedUser()
// && resource.data.group in get(/databases/$(database)/documents/user/$(request.auth.uid)).data.groups
&& resource.data.group in request.auth.token.groups
&& resource.data.group in request.auth.token.groups;

function callAuthorized() {
return authorizedUser() && get(/databases/$(database)/documents/call/$(doc)).data.group in request.auth.token.groups
}

match /{subitem=**} {
allow read, write: if callAuthorized()
}

}

match /clusters/{doc=**} {
Expand Down
3 changes: 1 addition & 2 deletions src/app/admin/adminActions.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
'use server';

import { uniqueArray } from '../../common/arrayUtils';
import { UserRecordExtended } from '../../common/users';
import {
Firecall,
FIRECALL_COLLECTION_ID,
USER_COLLECTION_ID,
} from '../../components/firebase/firestore';
import { firebaseAuth, firestore } from '../../server/firebase/admin';
import { firestore } from '../../server/firebase/admin';
import { setCustomClaimsForUser } from '../api/users/[uid]/updateUser';
import { actionAdminRequired } from '../auth';

Expand Down
2 changes: 0 additions & 2 deletions src/app/api/users/[uid]/updateUser.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
'use server';

import { uniqueArray } from '../../../../common/arrayUtils';
import { isTruthy } from '../../../../common/boolish';
import { feuerwehren } from '../../../../common/feuerwehren';
Expand Down
30 changes: 1 addition & 29 deletions src/app/groups/GroupAction.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
'use server';

import { uniqueArray } from '../../common/arrayUtils';
import { UserRecordExtended } from '../../common/users';
import {
GROUP_COLLECTION_ID,
USER_COLLECTION_ID,
Expand All @@ -12,21 +11,7 @@ import {
setCustomClaimsForUser,
} from '../api/users/[uid]/updateUser';
import { actionAdminRequired, actionUserRequired } from '../auth';

export interface Group {
id?: string;
name: string;
description?: string;
}

async function getGroups(): Promise<Group[]> {
const groupDocs = (
await firestore.collection(GROUP_COLLECTION_ID).orderBy('name', 'asc').get()
).docs;
return groupDocs.map(
(g) => ({ ...g.data(), name: g.data().name || '', id: g.id } as Group)
);
}
import { getGroups, getMyGroups, Group } from './groupHelpers';

export async function getGroupsAction(): Promise<Group[]> {
await actionUserRequired();
Expand Down Expand Up @@ -121,19 +106,6 @@ export async function updateGroupAction(group: Group, assigendUsers: string[]) {
return groupId;
}

async function getMyGroups(userId: string): Promise<Group[]> {
const allGropus = await getGroups();
const myGroupIds =
(
(
await firestore.collection(USER_COLLECTION_ID).doc(userId).get()
).data() as UserRecordExtended
).groups || [];
return allGropus
.filter((g) => g.id && myGroupIds.includes(g.id))
.sort((a, b) => a.name.localeCompare(b.name));
}

export async function getMyGroupsFromServer(): Promise<Group[]> {
const userInfo = await actionUserRequired();

Expand Down
14 changes: 7 additions & 7 deletions src/app/groups/GroupDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import Button from '@mui/material/Button';
import Checkbox from '@mui/material/Checkbox';
import Dialog from '@mui/material/Dialog';
import DialogActions from '@mui/material/DialogActions';
import DialogContent from '@mui/material/DialogContent';
import DialogContentText from '@mui/material/DialogContentText';
import DialogTitle from '@mui/material/DialogTitle';
import Select, { SelectChangeEvent } from '@mui/material/Select';
import TextField from '@mui/material/TextField';
import React, { useEffect, useMemo, useState } from 'react';
import { Group } from './GroupAction';
import { UserRecordExtended } from '../../common/users';
import FormControl from '@mui/material/FormControl';
import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem';
import Checkbox from '@mui/material/Checkbox';
import ListItemText from '@mui/material/ListItemText';
import MenuItem from '@mui/material/MenuItem';
import OutlinedInput from '@mui/material/OutlinedInput';
import Select, { SelectChangeEvent } from '@mui/material/Select';
import TextField from '@mui/material/TextField';
import React, { useEffect, useState } from 'react';
import { UserRecordExtended } from '../../common/users';
import { Group } from './groupHelpers';

export interface GroupDialoggOptions {
onClose: (item?: Group, assigendUsers?: string[]) => void;
Expand Down
34 changes: 34 additions & 0 deletions src/app/groups/groupHelpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { UserRecordExtended } from '../../common/users';
import {
GROUP_COLLECTION_ID,
USER_COLLECTION_ID,
} from '../../components/firebase/firestore';
import { firestore } from '../../server/firebase/admin';

export interface Group {
id?: string;
name: string;
description?: string;
}

export async function getGroups(): Promise<Group[]> {
const groupDocs = (
await firestore.collection(GROUP_COLLECTION_ID).orderBy('name', 'asc').get()
).docs;
return groupDocs.map(
(g) => ({ ...g.data(), name: g.data().name || '', id: g.id } as Group)
);
}

export async function getMyGroups(userId: string): Promise<Group[]> {
const allGropus = await getGroups();
const myGroupIds =
(
(
await firestore.collection(USER_COLLECTION_ID).doc(userId).get()
).data() as UserRecordExtended
).groups || [];
return allGropus
.filter((g) => g.id && myGroupIds.includes(g.id))
.sort((a, b) => a.name.localeCompare(b.name));
}
2 changes: 1 addition & 1 deletion src/app/groups/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ import { getUsers } from '../users/action';
import {
deleteGroupAction,
getGroupsAction,
Group,
updateGroupAction,
} from './GroupAction';
import GroupDialog from './GroupDialog';
import { Group } from './groupHelpers';

interface UserRowButtonParams {
row: Group;
Expand Down
6 changes: 2 additions & 4 deletions src/app/users/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,13 @@ import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
import Typography from '@mui/material/Typography';
import { green, red } from '@mui/material/colors';
import { GridColDef } from '@mui/x-data-grid';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { feuerwehren } from '../../common/feuerwehren';
import React, { useCallback, useMemo, useState } from 'react';
import { UserRecordExtended } from '../../common/users';
import UserRecordExtendedDialog from '../../components/users/UserDialog';
import useFirebaseCollection from '../../hooks/useFirebaseCollection';
import useUpdateUser from '../../hooks/useUpdateUser';
import useUserList from '../../hooks/useUserList';
import { Group } from '../groups/GroupAction';
import { Group } from '../groups/groupHelpers';

interface UserRowButtonParams {
row: UserRecordExtended;
Expand Down
18 changes: 8 additions & 10 deletions src/components/FirecallItems/EinsatzDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,21 @@ import DialogActions from '@mui/material/DialogActions';
import DialogContent from '@mui/material/DialogContent';
import DialogContentText from '@mui/material/DialogContentText';
import DialogTitle from '@mui/material/DialogTitle';
import FormControl from '@mui/material/FormControl';
import InputLabel from '@mui/material/InputLabel';
import MenuItem from '@mui/material/MenuItem';
import Select, { SelectChangeEvent } from '@mui/material/Select';
import TextField from '@mui/material/TextField';
import { addDoc, collection, doc, setDoc } from 'firebase/firestore';
import { useCallback, useEffect, useState } from 'react';
import { useCallback, useState } from 'react';
import { GeoPositionObject } from '../../common/geo';
import { parseTimestamp } from '../../common/time-format';
import { defaultPosition } from '../../hooks/constants';
import useFirebaseLogin from '../../hooks/useFirebaseLogin';
import { useFirecallSelect } from '../../hooks/useFirecall';
import { defaultPosition } from '../../hooks/constants';
import { firestore } from '../firebase/firebase';
import { Firecall, FIRECALL_COLLECTION_ID } from '../firebase/firestore';
import MyDateTimePicker from '../inputs/DateTimePicker';
import moment from 'moment';
import { GeoPositionObject } from '../../common/geo';
import { parseTimestamp } from '../../common/time-format';
import FormControl from '@mui/material/FormControl';
import InputLabel from '@mui/material/InputLabel';
import Select, { SelectChangeEvent } from '@mui/material/Select';
import MenuItem from '@mui/material/MenuItem';
import { getMyGroupsFromServer, Group } from '../../app/groups/GroupAction';

export interface EinsatzDialogOptions {
onClose: (einsatz?: Firecall) => void;
Expand Down
11 changes: 5 additions & 6 deletions src/components/Map/layers/FirecallItemsLayer.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Suspense, useMemo, useState } from 'react';
import { where } from 'firebase/firestore';
import React, { useMemo, useState } from 'react';
import useFirebaseCollection from '../../../hooks/useFirebaseCollection';
import useFirecall from '../../../hooks/useFirecall';
import { useFirecallId } from '../../../hooks/useFirecall';
import {
filterDisplayableItems,
FIRECALL_COLLECTION_ID,
Expand All @@ -9,8 +10,6 @@ import {
} from '../../firebase/firestore';
import { getItemInstance } from '../../FirecallItems/elements';
import ItemOverlay from '../../FirecallItems/ItemOverlay';
import React from 'react';
import { where } from 'firebase/firestore';

export interface FirecallLayerOptions {
layer?: FirecallLayer;
Expand All @@ -29,7 +28,7 @@ function renderMarker(
}

export default function FirecallItemsLayer({ layer }: FirecallLayerOptions) {
const firecall = useFirecall();
const firecallId = useFirecallId();
const [firecallItem, setFirecallItem] = useState<FirecallItem>();
const queryConstraints = useMemo(
() => (layer?.id ? [where('layer', '==', layer.id)] : []),
Expand All @@ -47,7 +46,7 @@ export default function FirecallItemsLayer({ layer }: FirecallLayerOptions) {
const records = useFirebaseCollection<FirecallItem>({
collectionName: FIRECALL_COLLECTION_ID,
queryConstraints,
pathSegments: [firecall?.id || 'unknown', 'item'],
pathSegments: [firecallId, 'item'],
filterFn,
});

Expand Down
2 changes: 1 addition & 1 deletion src/components/Map/layers/UnwetterAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ const fetchUWD = async (sheetId: string, range: string) => {
return markers;
};

export const fetchUnwetterCachedData = unstable_cache(
const fetchUnwetterCachedData = unstable_cache(
async (sheetId: string, range: string) => fetchUWD(sheetId, range),
['unwetter-sheet-data'],
{ revalidate: 10 }
Expand Down
Loading

0 comments on commit db3260b

Please sign in to comment.