diff --git a/package.json b/package.json index 6d98632..8f689f2 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "license": "MIT", "dependencies": { "@sendgrid/mail": "^6.2.1", - "@smokenetwork/smoke-js": "^0.1.2", + "@smokenetwork/smoke-js": "^0.1.3", "@steem/crypto-session": "git+https://github.com/steemit/crypto-session.git#83a90b319ce5bc6a70362d52a15a815de7e729bb", "assert": "^1.3.0", "autoprefixer-loader": "^3.2.0", diff --git a/src/app/components/modules/LoginForm.jsx b/src/app/components/modules/LoginForm.jsx index df848bf..217db90 100644 --- a/src/app/components/modules/LoginForm.jsx +++ b/src/app/components/modules/LoginForm.jsx @@ -71,7 +71,7 @@ class LoginForm extends Component { initialValues: props.initialValues, validation: values => ({ username: !values.username ? tt('g.required') : validate_account_name(values.username.split('/')[0]), - password: !values.password ? tt('g.required') : + password: window.whalevault && values.password != null && values.password == '' ? null : !values.password ? tt('g.required') : PublicKey.fromString(values.password) ? tt('loginform_jsx.you_need_a_private_password_or_key') : null, }) @@ -137,7 +137,8 @@ class LoginForm extends Component { const {username, password, saveLogin} = this.state; const {submitting, valid, handleSubmit} = this.state.login; const {usernameOnChange, onCancel, /*qrReader*/} = this; - const disabled = submitting || !valid; + const isWV = (typeof window !== 'undefined') && (window.whalevault != null) && (this.state.username.value != '') && (this.state.password.value == ''); + const disabled = submitting || (!valid && !isWV); const opType = loginBroadcastOperation ? loginBroadcastOperation.get('type') : null; let postType = ""; if (opType === "vote") { @@ -200,7 +201,7 @@ class LoginForm extends Component {
{username.error} 
: null}
- {error &&
{error} 
} diff --git a/src/app/locales/en.json b/src/app/locales/en.json index 98f8c9e..3a01e9d 100644 --- a/src/app/locales/en.json +++ b/src/app/locales/en.json @@ -528,7 +528,7 @@ "password_update_succes": "The password for %(accountName)s was successfully updated", "password_info": "This password or private key was entered incorrectly. There is probably a handwriting or data-entry error. Hint: A password or private key generated by Smoke will never contain 0 (zero), O (capital o), I (capital i) and l (lower case L) characters.", "enter_your_username": "Enter your username", - "password_or_wif": "Password or WIF", + "password_or_wif": "Password or WIF (leave blank for WhaleVault)", "this_operation_requires_your_key_or_master_password": "This operation requires your %(authType)s key or Master password.", "keep_me_logged_in": "Keep me logged in", "amazing_community": " Free Smoke Power", diff --git a/src/app/redux/.TransactionSaga.js.swp b/src/app/redux/.TransactionSaga.js.swp new file mode 100644 index 0000000..efc276b Binary files /dev/null and b/src/app/redux/.TransactionSaga.js.swp differ diff --git a/src/app/redux/TransactionSaga.js b/src/app/redux/TransactionSaga.js index eedde82..bf5186e 100644 --- a/src/app/redux/TransactionSaga.js +++ b/src/app/redux/TransactionSaga.js @@ -157,11 +157,23 @@ function* broadcastOperation({ if (!keys || keys.length === 0) { payload.keys = [] // user may already be logged in, or just enterend a signing passowrd or wif - const signingKey = yield call(findSigningKey, {opType: type, username, password}) + var signingKey = null; + const currentUser = yield select(state => state.user.get('current')); + const isWV = currentUser.get('whalevault'); + if (!isWV) signingKey = yield call(findSigningKey, {opType: type, username, password}) if (signingKey) payload.keys.push(signingKey) else { if (!password) { + if (isWV) { + const account = yield select( + state => state.user.getIn(['current', 'username']) + ) + const scope = ['vote', 'comment', 'delete_comment', 'custom_json', 'claim_reward_balance'].includes(type) ? 'posting' : 'active'; + payload.keys.push(account+":"+payload.operations[0][0]+":"+scope); + yield call(broadcastPayload, {payload}); + return; + } yield put(user.actions.showLogin({ operation: { type, diff --git a/src/app/redux/UserSaga.js b/src/app/redux/UserSaga.js index 7de549f..7939479 100644 --- a/src/app/redux/UserSaga.js +++ b/src/app/redux/UserSaga.js @@ -8,7 +8,7 @@ import {browserHistory} from 'react-router' import {serverApiLogin, serverApiLogout, serverApiRecordEvent} from '../utils/ServerApiClient'; import {loadFollows} from './FollowSaga' import {hash, PrivateKey, Signature} from '@smokenetwork/smoke-js/lib/auth/ecc'; -import {api} from '@smokenetwork/smoke-js'; +import {api, config} from '@smokenetwork/smoke-js'; import {translate} from '../Translator'; import DMCAUserList from '../utils/DMCAUserList'; @@ -128,8 +128,9 @@ function* usernamePasswordLogin2({ login_owner_pubkey = clean(login_owner_pubkey); } } + const isWV = (typeof window !== 'undefined') && (window.whalevault != null) && (username != '') && (password != null) && ((password == '') || password.endsWith(':')); // no saved password - if (!username || !password) { + if (!username || (!password && !isWV)) { const offchain_account = yield select(state => state.offchain.get('account')) if (offchain_account) serverApiLogout() return @@ -162,6 +163,38 @@ function* usernamePasswordLogin2({ let private_keys try { + + if (isWV) { + const smkjs_config = config; + smkjs_config.set('whalevault', window.whalevault); + const posting_pub_key = account.getIn(['posting', 'key_auths', 0, 0]); + try { + const wvPubkeys = yield smkjs_config.get('whalevault').promiseRequestPubKeys('smk_webapp', `smk:${username}`); + window.console.log(wvPubkeys); + if (wvPubkeys.result[`smk:${username}`].postingPubkey !== posting_pub_key) { + yield put(user.actions.loginError({error: 'WhaleVault key mismatch'})) + return; + } + } catch (e) { + yield put(user.actions.loginError({error: 'WhaleVault key not found'})) + return; + } + password = username + ":"; + yield put(user.actions.setUser({ + username, + private_keys: null, + login_owner_pubkey: posting_pub_key, + vesting_shares: account.get('vesting_shares'), + received_vesting_shares: account.get('received_vesting_shares'), + delegated_vesting_shares: account.get('delegated_vesting_shares'), + whalevault: true + })); + if (afterLoginRedirectToWelcome) browserHistory.push('/created'); + const data = new Buffer(`${username}\t${password}\t${''}\t${posting_pub_key || ''}`).toString('hex') + localStorage.setItem('autopost2', data); + return; + } + const private_key = PrivateKey.fromWif(password) login_wif_owner_pubkey = private_key.toPublicKey().toString() private_keys = fromJS({