diff options
-rw-r--r-- | ansible/VERSION | 2 | ||||
-rw-r--r-- | docker/prod/docker-compose.yml | 2 | ||||
-rw-r--r-- | server/src/rate_limit/rate_limiter.rs | 17 | ||||
-rw-r--r-- | server/src/version.rs | 2 | ||||
-rw-r--r-- | ui/src/components/comment-form.tsx | 4 | ||||
-rw-r--r-- | ui/src/components/login.tsx | 49 | ||||
-rw-r--r-- | ui/src/version.ts | 2 | ||||
-rw-r--r-- | ui/translations/en.json | 3 |
8 files changed, 69 insertions, 12 deletions
diff --git a/ansible/VERSION b/ansible/VERSION index 378c127d..b977a66d 100644 --- a/ansible/VERSION +++ b/ansible/VERSION @@ -1 +1 @@ -v0.7.6 +v0.7.7 diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index cd364a3c..b915b7f0 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -12,7 +12,7 @@ services: restart: always lemmy: - image: dessalines/lemmy:v0.7.6 + image: dessalines/lemmy:v0.7.7 ports: - "127.0.0.1:8536:8536" restart: always diff --git a/server/src/rate_limit/rate_limiter.rs b/server/src/rate_limit/rate_limiter.rs index 3e2ea787..20a617c2 100644 --- a/server/src/rate_limit/rate_limiter.rs +++ b/server/src/rate_limit/rate_limiter.rs @@ -10,7 +10,7 @@ pub struct RateLimitBucket { allowance: f64, } -#[derive(Eq, PartialEq, Hash, Debug, EnumIter, Copy, Clone)] +#[derive(Eq, PartialEq, Hash, Debug, EnumIter, Copy, Clone, AsRefStr)] pub enum RateLimitType { Message, Register, @@ -80,12 +80,21 @@ impl RateLimiter { if rate_limit.allowance < 1.0 { debug!( - "Rate limited IP: {}, time_passed: {}, allowance: {}", - ip, time_passed, rate_limit.allowance + "Rate limited type: {}, IP: {}, time_passed: {}, allowance: {}", + type_.as_ref(), + ip, + time_passed, + rate_limit.allowance ); Err( APIError { - message: format!("Too many requests. {} per {} seconds", rate, per), + message: format!( + "Too many requests. type: {}, IP: {}, {} per {} seconds", + type_.as_ref(), + ip, + rate, + per + ), } .into(), ) diff --git a/server/src/version.rs b/server/src/version.rs index b72c8198..df68fe43 100644 --- a/server/src/version.rs +++ b/server/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "v0.7.6"; +pub const VERSION: &str = "v0.7.7"; diff --git a/ui/src/components/comment-form.tsx b/ui/src/components/comment-form.tsx index 72a604b9..61ee3d77 100644 --- a/ui/src/components/comment-form.tsx +++ b/ui/src/components/comment-form.tsx @@ -263,7 +263,9 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> { // If its a comment edit, only check that its from your user, and that its a // text edit only - (op == UserOperation.EditComment && data.comment.content) + (data.comment.creator_id == UserService.Instance.user.id && + op == UserOperation.EditComment && + data.comment.content) ) { this.state.previewMode = false; this.state.loading = false; diff --git a/ui/src/components/login.tsx b/ui/src/components/login.tsx index ce04d0d4..97899345 100644 --- a/ui/src/components/login.tsx +++ b/ui/src/components/login.tsx @@ -20,6 +20,11 @@ interface State { loginLoading: boolean; registerLoading: boolean; enable_nsfw: boolean; + mathQuestion: { + a: number; + b: number; + answer: number; + }; } export class Login extends Component<any, State> { @@ -40,6 +45,11 @@ export class Login extends Component<any, State> { loginLoading: false, registerLoading: false, enable_nsfw: undefined, + mathQuestion: { + a: Math.floor(Math.random() * 10) + 1, + b: Math.floor(Math.random() * 10) + 1, + answer: undefined, + }, }; constructor(props: any, context: any) { @@ -215,6 +225,23 @@ export class Login extends Component<any, State> { /> </div> </div> + <div class="form-group row"> + <label class="col-sm-10 col-form-label" htmlFor="register-math"> + {i18n.t('what_is')}{' '} + {`${this.state.mathQuestion.a} + ${this.state.mathQuestion.b}?`} + </label> + + <div class="col-sm-2"> + <input + type="number" + id="register-math" + class="form-control" + value={this.state.mathQuestion.answer} + onInput={linkEvent(this, this.handleMathAnswerChange)} + required + /> + </div> + </div> {this.state.enable_nsfw && ( <div class="form-group row"> <div class="col-sm-10"> @@ -235,7 +262,11 @@ export class Login extends Component<any, State> { )} <div class="form-group row"> <div class="col-sm-10"> - <button type="submit" class="btn btn-secondary"> + <button + type="submit" + class="btn btn-secondary" + disabled={this.mathCheck} + > {this.state.registerLoading ? ( <svg class="icon icon-spinner spin"> <use xlinkHref="#icon-spinner"></use> @@ -272,7 +303,9 @@ export class Login extends Component<any, State> { i.state.registerLoading = true; i.setState(i.state); - WebSocketService.Instance.register(i.state.registerForm); + if (!i.mathCheck) { + WebSocketService.Instance.register(i.state.registerForm); + } } handleRegisterUsernameChange(i: Login, event: any) { @@ -303,6 +336,11 @@ export class Login extends Component<any, State> { i.setState(i.state); } + handleMathAnswerChange(i: Login, event: any) { + i.state.mathQuestion.answer = event.target.value; + i.setState(i.state); + } + handlePasswordReset(i: Login) { event.preventDefault(); let resetForm: PasswordResetForm = { @@ -311,6 +349,13 @@ export class Login extends Component<any, State> { WebSocketService.Instance.passwordReset(resetForm); } + get mathCheck(): boolean { + return ( + this.state.mathQuestion.answer != + this.state.mathQuestion.a + this.state.mathQuestion.b + ); + } + parseMessage(msg: WebSocketJsonResponse) { let res = wsJsonToRes(msg); if (msg.error) { diff --git a/ui/src/version.ts b/ui/src/version.ts index 8ad27e7c..5a734de9 100644 --- a/ui/src/version.ts +++ b/ui/src/version.ts @@ -1 +1 @@ -export const version: string = 'v0.7.6'; +export const version: string = 'v0.7.7'; diff --git a/ui/translations/en.json b/ui/translations/en.json index 6d2d1c5d..62b11ce4 100644 --- a/ui/translations/en.json +++ b/ui/translations/en.json @@ -264,5 +264,6 @@ "time": "Time", "action": "Action", "emoji_picker": "Emoji Picker", - "block_leaving": "Are you sure you want to leave?" + "block_leaving": "Are you sure you want to leave?", + "what_is": "What is" } |