BTC Certificate feature
Added the ability to register card content on the BTC blockchain in order to certify its existance/content
This commit is contained in:
@@ -24,33 +24,13 @@ refer to http://www.clipperz.com.
|
||||
Clipperz.Base.module('Clipperz.PM.UI.Components.Pages');
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.CardDetailPageClass = React.createClass({
|
||||
|
||||
displayName: 'Clipperz.PM.UI.Components.Pages.CardDetailPage',
|
||||
|
||||
propTypes: {
|
||||
'allTags': React.PropTypes.array,
|
||||
},
|
||||
|
||||
/*
|
||||
viewComponentProps: function () {
|
||||
var result;
|
||||
|
||||
result = this.props['selectedCard'];
|
||||
if (result) {
|
||||
result['style'] = this.props['style'];
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
render: function () {
|
||||
var result;
|
||||
if (this.props['mode'] == 'edit') {
|
||||
result = Clipperz.PM.UI.Components.Cards.Edit(this.viewComponentProps());
|
||||
} else {
|
||||
result = Clipperz.PM.UI.Components.Cards.View(this.viewComponentProps());
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
*/
|
||||
render: function () {
|
||||
return Clipperz.PM.UI.Components.Cards.Detail(this.props);
|
||||
}
|
||||
|
||||
@@ -25,26 +25,28 @@ Clipperz.Base.module('Clipperz.PM.UI.Components.Pages');
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.ErrorPageClass = React.createClass({
|
||||
|
||||
getDefaultProps: function () {
|
||||
return {
|
||||
// template: Clipperz.PM.UI.Components.PageTemplate
|
||||
}
|
||||
},
|
||||
|
||||
'propTypes': {
|
||||
// type: React.PropTypes.oneOf(['PERMANENT', 'TEMPORARY']),
|
||||
message: React.PropTypes.string.isRequired,
|
||||
template: React.PropTypes.func
|
||||
},
|
||||
|
||||
displayName: 'Clipperz.PM.UI.Components.Pages.ErrorPage',
|
||||
|
||||
render: function () {
|
||||
return React.DOM.div({className:'error-message'}, this.props.message);
|
||||
},
|
||||
|
||||
// render: function () {
|
||||
// return new this.props.template({'innerComponent': this._render()});
|
||||
// }
|
||||
//console.log("ERROR PAGE", this.props);
|
||||
return React.DOM.div({}, [
|
||||
React.DOM.header({}, [
|
||||
React.DOM.h2({}, 'clipperz')
|
||||
]),
|
||||
React.DOM.div({}, [
|
||||
React.DOM.div({'className':'error-box'}, [
|
||||
React.DOM.div({}, [
|
||||
React.DOM.p({}, "Ops!"),
|
||||
React.DOM.p({}, "Sorry, something went wrong."),
|
||||
React.DOM.p({}, "Please reload."),
|
||||
]),
|
||||
React.DOM.div({'className':'error-message'}, [
|
||||
React.DOM.p({}, this.props['error'] ? this.props['error']['message'] : '')
|
||||
])
|
||||
])
|
||||
])
|
||||
])
|
||||
}
|
||||
});
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.ErrorPage = React.createFactory(Clipperz.PM.UI.Components.Pages.ErrorPageClass);
|
||||
|
||||
@@ -26,6 +26,8 @@ Clipperz.Base.module('Clipperz.PM.UI.Components.Pages');
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
|
||||
displayName: 'Clipperz.PM.UI.Components.Pages.LoginPage',
|
||||
|
||||
propTypes: {
|
||||
mode: React.PropTypes.oneOf(['CREDENTIALS','PIN']).isRequired,
|
||||
isNewUserRegistrationAvailable: React.PropTypes.bool.isRequired,
|
||||
@@ -59,7 +61,7 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
|
||||
handleChange: function (anEvent) {
|
||||
var refs = this.refs;
|
||||
var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
|
||||
var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName] == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
|
||||
var newState = {};
|
||||
|
||||
newState[refName] = anEvent.target.value;
|
||||
@@ -70,8 +72,8 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
if (this.mode() == 'CREDENTIALS') {
|
||||
var newState;
|
||||
|
||||
var usernameValue = this.refs['username'].getDOMNode().value;
|
||||
var passphraseValue = this.refs['passphrase'].getDOMNode().value;
|
||||
var usernameValue = this.refs['username'].value;
|
||||
var passphraseValue = this.refs['passphrase'].value;
|
||||
|
||||
newState = {};
|
||||
|
||||
@@ -87,11 +89,11 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
handleCredentialSubmit: function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
this.refs['passphrase'].getDOMNode().blur();
|
||||
this.refs['passphrase'].blur();
|
||||
|
||||
var credentials = {
|
||||
'username': this.refs['username'].getDOMNode().value,
|
||||
'passphrase': this.refs['passphrase'].getDOMNode().value
|
||||
'username': this.refs['username'].value,
|
||||
'passphrase': this.refs['passphrase'].value
|
||||
}
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', credentials);
|
||||
},
|
||||
@@ -116,7 +118,7 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
},
|
||||
|
||||
loginForm: function () {
|
||||
return React.DOM.form({'key':'form', 'className':'loginForm credentials', 'autoComplete':'off', 'autoCorrect':'off', 'autoCapitalize':'off', 'onChange':this.handleChange, 'onSubmit':this.handleCredentialSubmit}, [
|
||||
return React.DOM.form({'key':'loginForm', 'className':'loginForm credentials', 'autoComplete':'off', 'autoCorrect':'off', 'autoCapitalize':'off', 'onChange':this.handleChange, 'onSubmit':this.handleCredentialSubmit}, [
|
||||
React.DOM.div({'key':'fields'},[
|
||||
React.DOM.label({'key':'username-label', 'htmlFor' :'name'}, "username"),
|
||||
React.DOM.input({'key':'username', 'type':'text', 'name':'name', 'ref':'username', 'placeholder':"username", 'autoComplete':'off', 'autoCorrect':'off', 'autoCapitalize':'off', 'spellCheck': false}),
|
||||
@@ -128,10 +130,10 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
},
|
||||
|
||||
submitPIN: function (event) {
|
||||
this.refs['pin'].getDOMNode().blur();
|
||||
this.refs['pin'].blur();
|
||||
|
||||
var credentials = {
|
||||
pin: this.refs['pin'].getDOMNode().value
|
||||
pin: this.refs['pin'].value
|
||||
}
|
||||
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', credentials);
|
||||
@@ -153,7 +155,7 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
|
||||
// handlePinFocus: function(anEvent) {
|
||||
// // anEvent.preventDefault();
|
||||
// this.refs['pin'].getDOMNode().focus();
|
||||
// this.refs['pin'].focus();
|
||||
// },
|
||||
|
||||
// pinFormDigits: function() {
|
||||
@@ -179,12 +181,13 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
|
||||
pinForm: function () {
|
||||
return React.DOM.form({
|
||||
'key':'pinForm',
|
||||
'className':'pinForm pin',
|
||||
'autoComplete':'off',
|
||||
'onSubmit': function(anEvent) {anEvent.preventDefault();},
|
||||
}, [
|
||||
React.DOM.div({'key':'pinFormDiv'},[
|
||||
React.DOM.label({'htmlFor':'pin'}, "Enter your PIN"),
|
||||
React.DOM.label({'key':'pinLabel', 'htmlFor':'pin'}, "Enter your PIN"),
|
||||
React.DOM.input({
|
||||
'type':'tel',
|
||||
'name':'pin',
|
||||
@@ -199,6 +202,7 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
}),
|
||||
// React.DOM.div({'className': 'pinContainer'}, this.pinFormDigits()),
|
||||
React.DOM.a({
|
||||
'key':'pinAnchor',
|
||||
'className': 'passphraseLogin',
|
||||
'onClick': this.forcePassphraseLogin,
|
||||
}, "Login with passphrase")
|
||||
@@ -212,12 +216,12 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
this.setState({
|
||||
'pin': ''
|
||||
})
|
||||
this.refs['pin'].getDOMNode().focus();
|
||||
this.refs['pin'].focus();
|
||||
} else {
|
||||
if (this.refs['username'].getDOMNode().value == '') {
|
||||
this.refs['username'].getDOMNode().focus();
|
||||
if (this.refs['username'].value == '') {
|
||||
this.refs['username'].focus();
|
||||
} else{
|
||||
this.refs['passphrase'].getDOMNode().select();
|
||||
this.refs['passphrase'].select();
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -234,22 +238,22 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
return React.DOM.div({'key':'loginForm', 'className':'loginForm content ' + this.props['style']}, [
|
||||
Clipperz.PM.UI.Components.AccountStatus(MochiKit.Base.update(this.props['proxyInfo'])),
|
||||
React.DOM.header({'key':'header'}, [
|
||||
React.DOM.div({'className':'headerContent'}, [
|
||||
React.DOM.h3({}, 'clipperz'),
|
||||
React.DOM.h5({}, 'keep it to yourself'),
|
||||
React.DOM.div({'key':'div', 'className':'headerContent'}, [
|
||||
React.DOM.h3({'key':'h3'}, 'clipperz'),
|
||||
React.DOM.h5({'key':'h5'}, 'keep it to yourself'),
|
||||
]),
|
||||
]),
|
||||
React.DOM.div({'key':'formWrapper', 'className':'form body'}, [
|
||||
React.DOM.div({'className':'bodyContent'}, [
|
||||
React.DOM.div({'key':'div', 'className':'bodyContent'}, [
|
||||
this.mode() == 'PIN' ? this.pinForm() : this.loginForm(),
|
||||
this.props['isNewUserRegistrationAvailable'] ? registrationLink : null,
|
||||
]),
|
||||
]),
|
||||
React.DOM.div({'key':'afterBody', 'className':'afterBody'}),
|
||||
React.DOM.div({'className':'other', 'key':'other'}, [
|
||||
React.DOM.div({'className':'otherContent'}, [
|
||||
React.DOM.div({'key':'other', 'className':'other'}, [
|
||||
React.DOM.div({'key':'otherContent', 'className':'otherContent'}, [
|
||||
React.DOM.div({'key':'links', 'className':'links'}, [
|
||||
React.DOM.ul({}, [
|
||||
React.DOM.ul({'key':'ul'}, [
|
||||
React.DOM.li({'key':'about', 'onClick':this.showUrl('/about/')}, "About"),
|
||||
React.DOM.li({'key':'terms', 'onClick':this.showUrl('/terms_service/')}, "Terms of service"),
|
||||
React.DOM.li({'key':'privacy', 'onClick':this.showUrl('/privacy_policy/')}, "Privacy"),
|
||||
@@ -258,7 +262,7 @@ Clipperz.PM.UI.Components.Pages.LoginPageClass = React.createClass({
|
||||
])
|
||||
]),
|
||||
React.DOM.footer({'key':'footer'}, [
|
||||
React.DOM.div({'className':'footerContent'}, [
|
||||
React.DOM.div({'key':'div', 'className':'footerContent'}, [
|
||||
React.DOM.div({'key':'applicationVersion', 'className':'applicationVersion'}, [
|
||||
React.DOM.span({'key':'applicationVersionLabel'}, "application version"),
|
||||
React.DOM.a({'key':'applicationVersionLink', 'href':'https://github.com/clipperz/password-manager/commit/' + Clipperz_version, 'target':'github'}, Clipperz_version)
|
||||
|
||||
@@ -26,6 +26,8 @@ Clipperz.Base.module('Clipperz.PM.UI.Components.Pages');
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.MainPageClass = React.createClass({
|
||||
|
||||
displayName: 'Clipperz.PM.UI.Components.Pages.MainPage',
|
||||
|
||||
getDefaultProps: function () {
|
||||
return {
|
||||
featureSet: 'FULL',
|
||||
@@ -69,6 +71,7 @@ Clipperz.PM.UI.Components.Pages.MainPageClass = React.createClass({
|
||||
|
||||
result = React.DOM.div({'key':'mainPage', 'className':Clipperz.PM.UI.Components.classNames(classes)}, [
|
||||
Clipperz.PM.UI.Components.AttachmentQueueBox(this.props),
|
||||
Clipperz.PM.UI.Components.CertificateQueueBox(this.props),
|
||||
this.props['style'] != 'extra-wide' ? Clipperz.PM.UI.Components.Panels.SelectionPanel(this.props) : null,
|
||||
Clipperz.PM.UI.Components.Panels.MainPanel(this.props),
|
||||
Clipperz.PM.UI.Components.Panels.ExtraFeaturesPanel(this.props),
|
||||
|
||||
@@ -25,6 +25,8 @@ Clipperz.Base.module('Clipperz.PM.UI.Components.Pages');
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.RegistrationPageClass = React.createClass({
|
||||
|
||||
displayName: 'Clipperz.PM.UI.Components.Pages.RegistrationPage',
|
||||
|
||||
getDefaultProps: function () {
|
||||
return {
|
||||
steps: [
|
||||
@@ -126,8 +128,8 @@ Clipperz.PM.UI.Components.Pages.RegistrationPageClass = React.createClass({
|
||||
toggleCheckbox: function (aCheckboxRef, anEvent) {
|
||||
var newState = {};
|
||||
|
||||
this.refs[aCheckboxRef].getDOMNode().checked = ! this.refs[aCheckboxRef].getDOMNode().checked;
|
||||
newState[aCheckboxRef] = this.refs[aCheckboxRef].getDOMNode().checked;
|
||||
this.refs[aCheckboxRef].checked = ! this.refs[aCheckboxRef].checked;
|
||||
newState[aCheckboxRef] = this.refs[aCheckboxRef].checked;
|
||||
this.setState(newState);
|
||||
},
|
||||
|
||||
@@ -154,7 +156,7 @@ Clipperz.PM.UI.Components.Pages.RegistrationPageClass = React.createClass({
|
||||
|
||||
handleChange: function (anEvent) {
|
||||
var refs = this.refs;
|
||||
var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
|
||||
var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName] == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
|
||||
var newState = {};
|
||||
|
||||
if ((anEvent.target.type == 'checkbox') || (anEvent.target.type == 'radio')) {
|
||||
@@ -213,12 +215,12 @@ Clipperz.PM.UI.Components.Pages.RegistrationPageClass = React.createClass({
|
||||
return React.DOM.div({'key':'termsOfService'}, [
|
||||
React.DOM.div({'key':'termsOfService_choice_1', 'className':'checkboxBlock'}, [
|
||||
React.DOM.label({'key':'termsOfService_label_1', 'htmlFor':'no_password_recovery'}, "I understand that Clipperz is unable to recover a lost passphrase."),
|
||||
React.DOM.input({'key':'no_password_recovery', 'type':'checkbox', 'name':'no_password_recovery', 'ref':'no_password_recovery', 'id':'no_password_recovery', 'tabindex':'0'}),
|
||||
React.DOM.input({'key':'no_password_recovery', 'type':'checkbox', 'name':'no_password_recovery', 'ref':'no_password_recovery', 'id':'no_password_recovery', 'tabIndex':'0'}),
|
||||
React.DOM.p({'key':'termsOfService_description_1', 'onClick':MochiKit.Base.method(this, 'toggleCheckbox', 'no_password_recovery')}, "I understand that Clipperz is unable to recover a lost passphrase.")
|
||||
]),
|
||||
React.DOM.div({'key':'termsOfService_choice_2', 'className':'checkboxBlock'}, [
|
||||
React.DOM.label({'key':'termsOfService_label_2', 'htmlFor':'agree_terms_of_service'}, "I have read and agreed to the Terms of Service."),
|
||||
React.DOM.input({'key':'agree_terms_of_service', 'type':'checkbox', 'name':'agree_terms_of_service', 'ref':'agree_terms_of_service', 'id':'agree_terms_of_service', 'tabindex':'1'}),
|
||||
React.DOM.input({'key':'agree_terms_of_service', 'type':'checkbox', 'name':'agree_terms_of_service', 'ref':'agree_terms_of_service', 'id':'agree_terms_of_service', 'tabIndex':'1'}),
|
||||
React.DOM.p({'key':'termsOfService_description_2'}, [
|
||||
React.DOM.span({'key':'termsOfService_description_2_p1', 'onClick':MochiKit.Base.method(this, 'toggleCheckbox', 'agree_terms_of_service')}, "I have read and agreed to the "),
|
||||
React.DOM.a({'key':'termsOfService_description_2_p2', 'onClick':this.showUrl('/terms_service/')}, "Terms of Service.")
|
||||
@@ -290,15 +292,15 @@ Clipperz.PM.UI.Components.Pages.RegistrationPageClass = React.createClass({
|
||||
//=========================================================================
|
||||
|
||||
setInitialFocus: function () {
|
||||
this.refs['username'].getDOMNode().focus();
|
||||
this.refs['username'].focus();
|
||||
},
|
||||
|
||||
componentDidUpdate: function (prevProps, prevState, rootNode) {
|
||||
if (prevState['currentStep'] != this.state['currentStep']) {
|
||||
if (this.state['currentStep'] == 'CREDENTIALS') {
|
||||
this.refs['passphrase'].getDOMNode().select();
|
||||
this.refs['passphrase'].select();
|
||||
} else if (this.state['currentStep'] == 'PASSWORD_VERIFICATION') {
|
||||
this.refs['verify_passphrase'].getDOMNode().select();
|
||||
this.refs['verify_passphrase'].select();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,10 +26,12 @@ Clipperz.Base.module('Clipperz.PM.UI.Components.Pages');
|
||||
|
||||
Clipperz.PM.UI.Components.Pages.UnlockPageClass = React.createClass({
|
||||
|
||||
displayName: 'Clipperz.PM.UI.Components.Pages.UnlockPage',
|
||||
|
||||
propTypes: {
|
||||
username: React.PropTypes.string.isRequired,
|
||||
// username: React.PropTypes.string.isRequired,
|
||||
mode: React.PropTypes.oneOf(['CREDENTIALS','PIN']).isRequired,
|
||||
disabled: React.PropTypes.bool.isRequired,
|
||||
// disabled: React.PropTypes.bool.isRequired,
|
||||
},
|
||||
|
||||
getInitialState: function () {
|
||||
@@ -70,29 +72,29 @@ Clipperz.PM.UI.Components.Pages.UnlockPageClass = React.createClass({
|
||||
handlePassphraseSubmit: function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
this.refs['passphrase'].getDOMNode().blur();
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'unlock', this.refs['passphrase'].getDOMNode().value, 'PASSPHRASE');
|
||||
this.refs['passphrase'].blur();
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'unlock', {'credential':this.refs['passphrase'].value, 'credentialType':'PASSPHRASE'});
|
||||
|
||||
// this.resetUnlockForm();
|
||||
},
|
||||
|
||||
submitPIN: function() {
|
||||
this.refs['pin'].getDOMNode().blur();
|
||||
this.refs['pin'].blur();
|
||||
|
||||
var pin = this.refs['pin'].getDOMNode().value;
|
||||
var pin = this.refs['pin'].value;
|
||||
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'unlock', pin, 'PIN');
|
||||
MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'unlock', {'credential':pin, 'credentialType':'PIN'});
|
||||
|
||||
// this.resetUnlockForm();
|
||||
},
|
||||
|
||||
resetUnlockForm: function() {
|
||||
if (this.mode() == 'CREDENTIALS') {
|
||||
this.refs['passphrase'].getDOMNode().value = '';
|
||||
this.refs['passphrase'].getDOMNode().blur();
|
||||
this.refs['passphrase'].value = '';
|
||||
this.refs['passphrase'].blur();
|
||||
} else if (this.mode() == 'PIN') {
|
||||
this.refs['pin'].getDOMNode().value = '';
|
||||
this.refs['pin'].getDOMNode().blur();
|
||||
this.refs['pin'].value = '';
|
||||
this.refs['pin'].blur();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -104,9 +106,9 @@ Clipperz.PM.UI.Components.Pages.UnlockPageClass = React.createClass({
|
||||
|
||||
setInitialFocus: function () {
|
||||
if (this.mode() == 'PIN') {
|
||||
this.refs['pin'].getDOMNode().focus();
|
||||
this.refs['pin'].focus();
|
||||
} else {
|
||||
this.refs['passphrase'].getDOMNode().focus();
|
||||
this.refs['passphrase'].focus();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user