Browse Source

Encode/decode room names in URLs.

main
Titouan Rigoudy 4 years ago
parent
commit
0979c193e0
6 changed files with 47 additions and 8 deletions
  1. +25
    -1
      package-lock.json
  2. +3
    -1
      package.json
  3. +2
    -4
      src/components/Room.tsx
  4. +1
    -1
      src/components/RoomChatForm.tsx
  5. +3
    -1
      src/containers/RoomsPane.tsx
  6. +13
    -0
      src/modules/base64.ts

+ 25
- 1
package-lock.json View File

@ -20,7 +20,8 @@
"react-redux": "^7.2.4", "react-redux": "^7.2.4",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
"typescript": "~4.1.5"
"typescript": "~4.1.5",
"utf8": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^24.9.1", "@types/jest": "^24.9.1",
@ -30,6 +31,7 @@
"@types/react-redux": "^7.1.18", "@types/react-redux": "^7.1.18",
"@types/react-router": "^5.1.16", "@types/react-router": "^5.1.16",
"@types/react-router-dom": "^5.1.8", "@types/react-router-dom": "^5.1.8",
"@types/utf8": "^3.0.0",
"prettier": "^2.3.2", "prettier": "^2.3.2",
"sass": "^1.36.0", "sass": "^1.36.0",
"sass-loader": "^10.2.0" "sass-loader": "^10.2.0"
@ -4019,6 +4021,12 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/@types/utf8": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/utf8/-/utf8-3.0.0.tgz",
"integrity": "sha512-QrhvCktdm5wD48axAnjqSzPH9lOj0MiCYfMX6MSqGs2Jv+txwvdxviXiCEj8zSCWIEDU9SIJ7g9pU5KtxRgYSg==",
"dev": true
},
"node_modules/@types/webpack": { "node_modules/@types/webpack": {
"version": "4.41.30", "version": "4.41.30",
"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz",
@ -20287,6 +20295,11 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/utf8": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
"integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
},
"node_modules/util": { "node_modules/util": {
"version": "0.11.1", "version": "0.11.1",
"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
@ -25147,6 +25160,12 @@
} }
} }
}, },
"@types/utf8": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@types/utf8/-/utf8-3.0.0.tgz",
"integrity": "sha512-QrhvCktdm5wD48axAnjqSzPH9lOj0MiCYfMX6MSqGs2Jv+txwvdxviXiCEj8zSCWIEDU9SIJ7g9pU5KtxRgYSg==",
"dev": true
},
"@types/webpack": { "@types/webpack": {
"version": "4.41.30", "version": "4.41.30",
"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz",
@ -37753,6 +37772,11 @@
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
}, },
"utf8": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
"integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
},
"util": { "util": {
"version": "0.11.1", "version": "0.11.1",
"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",


+ 3
- 1
package.json View File

@ -16,7 +16,8 @@
"react-redux": "^7.2.4", "react-redux": "^7.2.4",
"react-router-dom": "^5.2.0", "react-router-dom": "^5.2.0",
"react-scripts": "4.0.3", "react-scripts": "4.0.3",
"typescript": "~4.1.5"
"typescript": "~4.1.5",
"utf8": "^3.0.0"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",
@ -47,6 +48,7 @@
"@types/react-redux": "^7.1.18", "@types/react-redux": "^7.1.18",
"@types/react-router": "^5.1.16", "@types/react-router": "^5.1.16",
"@types/react-router-dom": "^5.1.8", "@types/react-router-dom": "^5.1.8",
"@types/utf8": "^3.0.0",
"prettier": "^2.3.2", "prettier": "^2.3.2",
"sass": "^1.36.0", "sass": "^1.36.0",
"sass-loader": "^10.2.0" "sass-loader": "^10.2.0"


+ 2
- 4
src/components/Room.tsx View File

@ -1,6 +1,7 @@
import { FC } from "react"; import { FC } from "react";
import { NavLink } from "react-router-dom"; import { NavLink } from "react-router-dom";
import { encode } from "../modules/base64";
import { RoomMembership, Room as RoomState } from "../modules/room/slice"; import { RoomMembership, Room as RoomState } from "../modules/room/slice";
interface Props { interface Props {
@ -16,12 +17,9 @@ const Room: FC<Props> = ({ name, data }) => {
classes.push("room-joined"); classes.push("room-joined");
} }
// TODO: Encode the name.
const path = `/rooms/${name}`;
return ( return (
<NavLink <NavLink
to={path}
to={`/rooms/${encode(name)}`}
activeClassName="room-selected" activeClassName="room-selected"
className={classes.join(" ")} className={classes.join(" ")}
> >


+ 1
- 1
src/components/RoomChatForm.tsx View File

@ -16,7 +16,7 @@ interface Fields {
const RoomChatForm: FC<Props> = ({ roomName, loginUserName }) => { const RoomChatForm: FC<Props> = ({ roomName, loginUserName }) => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const onSubmit = ({ message }: Fields, form: Form) => {
const onSubmit = ({ message }: Fields, form: any) => {
dispatch( dispatch(
roomMessage({ roomMessage({
roomName, roomName,


+ 3
- 1
src/containers/RoomsPane.tsx View File

@ -5,6 +5,7 @@ import { Switch, Route } from "react-router-dom";
import RoomChat from "../components/RoomChat"; import RoomChat from "../components/RoomChat";
import RoomList from "../components/RoomList"; import RoomList from "../components/RoomList";
import { decode } from "../modules/base64";
import { selectLogin } from "../modules/login/slice"; import { selectLogin } from "../modules/login/slice";
import { RoomMap, selectAllRooms } from "../modules/room/slice"; import { RoomMap, selectAllRooms } from "../modules/room/slice";
@ -19,7 +20,8 @@ interface UrlParams {
const RoomChatPane: FC<ChatProps> = ({ loginUserName, rooms }) => { const RoomChatPane: FC<ChatProps> = ({ loginUserName, rooms }) => {
const { roomId } = useParams<UrlParams>(); const { roomId } = useParams<UrlParams>();
return <RoomChat loginUserName={loginUserName} room={rooms[roomId]} />;
const name = decode(roomId);
return <RoomChat loginUserName={loginUserName} room={rooms[name]} />;
}; };
const RoomsPane: FC<{}> = () => { const RoomsPane: FC<{}> = () => {


+ 13
- 0
src/modules/base64.ts View File

@ -0,0 +1,13 @@
import utf8 from "utf8";
// Base64-encodes the given string. Supports UTF-8.
export function encode(str: string): string {
const bytes = utf8.encode(str);
return btoa(bytes);
}
// Base64-decodes the given string. Supports UTF-8.
export function decode(encoded: string): string {
const bytes = atob(encoded);
return utf8.decode(bytes);
}

Loading…
Cancel
Save