mirror of
				https://github.com/mickael-kerjean/filestash.git
				synced 2025-10-31 18:16:00 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import React from 'react';
 | |
| import PropTypes from 'prop-types';
 | |
| import ReactCSSTransitionGroup from 'react-addons-css-transition-group';
 | |
| 
 | |
| import { ModalPrompt } from '../../components/';
 | |
| import { encrypt, decrypt, memory, prompt } from '../../helpers/';
 | |
| 
 | |
| export class Credentials extends React.Component {
 | |
|     constructor(props){
 | |
|         super(props);
 | |
|         const key = memory.get('credentials_key') || ''; // we use a clojure for the "key" because we
 | |
|                                                          // want to persist it in memory, not just in the
 | |
|                                                          // state which is kill whenever react decide
 | |
|         this.state = {
 | |
|             key: key || '',
 | |
|             message: '',
 | |
|             error: null
 | |
|         };
 | |
| 
 | |
|         if(this.props.remember_me === true){
 | |
|             if(key === ""){
 | |
|                 let raw = window.localStorage.hasOwnProperty('credentials');
 | |
|                 if(raw){
 | |
|                     this.promptForExistingPassword();
 | |
|                 }else{
 | |
|                     this.promptForNewPassword();
 | |
|                 }
 | |
|             }else{
 | |
|                 this.hidrate_credentials(key);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     componentWillReceiveProps(new_props){
 | |
|         if(new_props.remember_me === false){
 | |
|             window.localStorage.clear();
 | |
|         }else if(new_props.remember_me === true){
 | |
|             this.saveCreds(new_props.credentials);
 | |
|         }
 | |
| 
 | |
|         if(new_props.remember_me === true && this.props.remember_me === false){
 | |
|             this.promptForNewPassword();
 | |
|         }else if(new_props.remember_me === false && this.props.remember_me === true){
 | |
|             memory.set('credentials_key', '');
 | |
|             this.setState({key: ''});
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     promptForExistingPassword(){
 | |
|         prompt.now(
 | |
|             "Your Master Password",
 | |
|             (key) => {
 | |
|                 if(!key.trim()) return Promise.reject("Password can\'t be empty");
 | |
|                 this.setState({key: key});
 | |
|                 memory.set('credentials_key', key);
 | |
|                 return this.hidrate_credentials(key);
 | |
|             },
 | |
|             () => {
 | |
|                 memory.set('credentials_key', '');
 | |
|                 this.setState({key: ''});
 | |
|             },
 | |
|             'password'
 | |
|         );
 | |
|     }
 | |
|     promptForNewPassword(){
 | |
|         prompt.now(
 | |
|             "Pick a Master Password",
 | |
|             (key) => {
 | |
|                 if(!key.trim()) return Promise.reject("Password can\'t be empty");
 | |
|                 memory.set('credentials_key', key);
 | |
|                 this.setState({key: key}, () => {
 | |
|                     this.saveCreds(this.props.credentials);
 | |
|                 });
 | |
|                 return Promise.resolve();
 | |
|             },
 | |
|             () => {},
 | |
|             'password'
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     hidrate_credentials(key){
 | |
|         let raw = window.localStorage.getItem('credentials');
 | |
|         if(raw){
 | |
|             try{
 | |
|                 let credentials = decrypt(raw, key);
 | |
|                 this.props.onCredentialsFound(credentials);
 | |
|                 return Promise.resolve();
 | |
|             }catch(e){
 | |
|                 return Promise.reject('Incorrect password');
 | |
|             }
 | |
|         }else{
 | |
|             this.saveCreds(this.props.credentials);
 | |
|             return Promise.resolve();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     saveCreds(creds){
 | |
|         const key = memory.get('credentials_key');
 | |
|         if(key){
 | |
|             window.localStorage.setItem('credentials', encrypt(creds, key));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     render() {
 | |
|         return null;
 | |
|     }
 | |
| }
 | 
