This commit is contained in:
		
							parent
							
								
									e787cb77f7
								
							
						
					
					
						commit
						8f0e6a70cf
					
				
					 6 changed files with 101 additions and 2 deletions
				
			
		|  | @ -5,6 +5,7 @@ ChangeLog | |||
| unlereased | ||||
| ---------- | ||||
| * New: トークンを再生成できるように (#497) | ||||
| * New: パスワードを変更する機能 (#364) | ||||
| 
 | ||||
| 2461 (2017/08/28) | ||||
| ----------------- | ||||
|  |  | |||
|  | @ -208,6 +208,12 @@ desktop: | |||
|       settings: "Settings" | ||||
|       signout: "Sign out" | ||||
| 
 | ||||
|     mk-password-setting: | ||||
|       reset: "Change your password" | ||||
|       enter-current-password: "Enter the current password" | ||||
|       enter-new-password: "Enter the new password" | ||||
|       changed: "Password updated successfully" | ||||
| 
 | ||||
|     mk-post-form: | ||||
|       post-placeholder: "What's happening?" | ||||
|       reply-placeholder: "Reply to this post..." | ||||
|  | @ -239,6 +245,9 @@ desktop: | |||
|       prev: "Previous post" | ||||
|       next: "Next post" | ||||
| 
 | ||||
|     mk-settings: | ||||
|       password: "Password" | ||||
| 
 | ||||
|     mk-timeline-post: | ||||
|       reposted-by: "Reposted by {}" | ||||
|       reply: "Reply" | ||||
|  |  | |||
|  | @ -208,6 +208,12 @@ desktop: | |||
|       settings: "設定" | ||||
|       signout: "サインアウト" | ||||
| 
 | ||||
|     mk-password-setting: | ||||
|       reset: "パスワードを変更する" | ||||
|       enter-current-password: "現在のパスワードを入力してください" | ||||
|       enter-new-password: "新しいパスワードを入力してください" | ||||
|       changed: "パスワードを変更しました" | ||||
| 
 | ||||
|     mk-post-form: | ||||
|       post-placeholder: "いまどうしてる?" | ||||
|       reply-placeholder: "この投稿への返信..." | ||||
|  | @ -239,6 +245,9 @@ desktop: | |||
|       prev: "前の投稿" | ||||
|       next: "次の投稿" | ||||
| 
 | ||||
|     mk-settings: | ||||
|       password: "パスワード" | ||||
| 
 | ||||
|     mk-timeline-post: | ||||
|       reposted-by: "{}がRepost" | ||||
|       reply: "返信" | ||||
|  |  | |||
|  | @ -159,6 +159,10 @@ const endpoints: Endpoint[] = [ | |||
| 		}, | ||||
| 		kind: 'account-write' | ||||
| 	}, | ||||
| 	{ | ||||
| 		name: 'i/change_password', | ||||
| 		withCredential: true | ||||
| 	}, | ||||
| 	{ | ||||
| 		name: 'i/regenerate_token', | ||||
| 		withCredential: true | ||||
|  |  | |||
							
								
								
									
										42
									
								
								src/api/endpoints/i/change_password.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/api/endpoints/i/change_password.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | |||
| /** | ||||
|  * Module dependencies | ||||
|  */ | ||||
| import $ from 'cafy'; | ||||
| import * as bcrypt from 'bcryptjs'; | ||||
| import User from '../../models/user'; | ||||
| 
 | ||||
| /** | ||||
|  * Change password | ||||
|  * | ||||
|  * @param {any} params | ||||
|  * @param {any} user | ||||
|  * @return {Promise<any>} | ||||
|  */ | ||||
| module.exports = async (params, user) => new Promise(async (res, rej) => { | ||||
| 	// Get 'current_password' parameter
 | ||||
| 	const [currentPassword, currentPasswordErr] = $(params.current_password).string().$; | ||||
| 	if (currentPasswordErr) return rej('invalid current_password param'); | ||||
| 
 | ||||
| 	// Get 'new_password' parameter
 | ||||
| 	const [newPassword, newPasswordErr] = $(params.new_password).string().$; | ||||
| 	if (newPasswordErr) return rej('invalid new_password param'); | ||||
| 
 | ||||
| 	// Compare password
 | ||||
| 	const same = bcrypt.compareSync(currentPassword, user.password); | ||||
| 
 | ||||
| 	if (!same) { | ||||
| 		return rej('incorrect password'); | ||||
| 	} | ||||
| 
 | ||||
| 	// Generate hash of password
 | ||||
| 	const salt = bcrypt.genSaltSync(8); | ||||
| 	const hash = bcrypt.hashSync(newPassword, salt); | ||||
| 
 | ||||
| 	await User.update(user._id, { | ||||
| 		$set: { | ||||
| 			password: hash | ||||
| 		} | ||||
| 	}); | ||||
| 
 | ||||
| 	res(); | ||||
| }); | ||||
|  | @ -7,7 +7,7 @@ | |||
| 		<p class={ active: page == 'apps' } onmousedown={ setPage.bind(null, 'apps') }><i class="fa fa-fw fa-puzzle-piece"></i>アプリ</p> | ||||
| 		<p class={ active: page == 'twitter' } onmousedown={ setPage.bind(null, 'twitter') }><i class="fa fa-fw fa-twitter"></i>Twitter</p> | ||||
| 		<p class={ active: page == 'signin' } onmousedown={ setPage.bind(null, 'signin') }><i class="fa fa-fw fa-sign-in"></i>ログイン履歴</p> | ||||
| 		<p class={ active: page == 'password' } onmousedown={ setPage.bind(null, 'password') }><i class="fa fa-fw fa-unlock-alt"></i>パスワード</p> | ||||
| 		<p class={ active: page == 'password' } onmousedown={ setPage.bind(null, 'password') }><i class="fa fa-fw fa-unlock-alt"></i>%i18n:desktop.tags.mk-settings.password%</p> | ||||
| 		<p class={ active: page == 'api' } onmousedown={ setPage.bind(null, 'api') }><i class="fa fa-fw fa-key"></i>API</p> | ||||
| 	</div> | ||||
| 	<div class="pages"> | ||||
|  | @ -58,6 +58,11 @@ | |||
| 			<mk-signin-history/> | ||||
| 		</section> | ||||
| 
 | ||||
| 		<section class="password" show={ page == 'password' }> | ||||
| 			<h1>%i18n:desktop.tags.mk-settings.password%</h1> | ||||
| 			<mk-password-setting/> | ||||
| 		</section> | ||||
| 
 | ||||
| 		<section class="api" show={ page == 'api' }> | ||||
| 			<h1>API</h1> | ||||
| 			<mk-api-info/> | ||||
|  | @ -236,8 +241,37 @@ | |||
| 			passwordDialog('%i18n:desktop.tags.mk-api-info.regenerate-token%', password => { | ||||
| 				this.api('i/regenerate_token', { | ||||
| 					password: password | ||||
| 				}) | ||||
| 				}); | ||||
| 			}); | ||||
| 		}; | ||||
| 	</script> | ||||
| </mk-api-info> | ||||
| 
 | ||||
| <mk-password-setting> | ||||
| 	<button onclick={ reset }>%i18n:desktop.tags.mk-password-setting.reset%</button> | ||||
| 	<style> | ||||
| 		:scope | ||||
| 			display block | ||||
| 			color #4a535a | ||||
| 	</style> | ||||
| 	<script> | ||||
| 		import passwordDialog from '../scripts/password-dialog'; | ||||
| 		import notify from '../scripts/notify'; | ||||
| 
 | ||||
| 		this.mixin('i'); | ||||
| 		this.mixin('api'); | ||||
| 
 | ||||
| 		this.reset = () => { | ||||
| 			passwordDialog('%i18n:desktop.tags.mk-password-setting.enter-current-password%', currentPassword => { | ||||
| 				passwordDialog('%i18n:desktop.tags.mk-password-setting.enter-new-password%', newPassword => { | ||||
| 					this.api('i/change_password', { | ||||
| 						current_password: currentPassword, | ||||
| 						new_password: newPassword | ||||
| 					}).then(() => { | ||||
| 						notify('%i18n:desktop.tags.mk-password-setting.changed%'); | ||||
| 					}); | ||||
| 				}); | ||||
| 			}); | ||||
| 		}; | ||||
| 	</script> | ||||
| </mk-password-setting> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue