-rw-r--r-- | frontend/beta/css/yui-extensions/basic-dialog.css | 6 | ||||
-rw-r--r-- | frontend/beta/js/Clipperz/PM/DataModel/Record.js | 10 | ||||
-rw-r--r-- | frontend/beta/js/Clipperz/PM/Strings/Strings_en-US.js | 2 | ||||
-rw-r--r-- | scripts/builder/repository.py | 11 |
4 files changed, 25 insertions, 4 deletions
diff --git a/frontend/beta/css/yui-extensions/basic-dialog.css b/frontend/beta/css/yui-extensions/basic-dialog.css index 2b1e20c..5a6cefb 100644 --- a/frontend/beta/css/yui-extensions/basic-dialog.css +++ b/frontend/beta/css/yui-extensions/basic-dialog.css @@ -1,247 +1,253 @@ /* Copyright 2008-2011 Clipperz Srl This file is part of Clipperz Community Edition. Clipperz Community Edition is an online password manager. For further information about its features and functionalities please refer to http://www.clipperz.com. * Clipperz Community Edition is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * Clipperz Community Edition is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public License along with Clipperz Community Edition. If not, see <http://www.gnu.org/licenses/>. */ .ydlg-proxy {
+<<<<<<< HEAD background-image: url(./images/default/gradient-bg.gif);
+======= +>>>>>>> 0db1d5c8b18eadc4bd9cfc6603e86227fa94b5a9 background-color:#c3daf9;
border:1px solid #6593cf;
z-index:10001;
overflow:hidden;
position:absolute;
left:0;top:0;
}
.ydlg-shadow{
background:#aaaaaa;
position:absolute;
left:0;top:0;
}
.ydlg-focus{
-moz-outline:0 none;
outline:0 none;
width:0;
height:0;
overflow:hidden;
position:absolute;
top:0;
left:0;
}
.ydlg-mask{
z-index:10000;
display:none;
position:absolute;
top:0;
left:0;
-moz-opacity: 0.5;
opacity:.50;
filter: alpha(opacity=50);
background-color:#CCC;
}
body.masked{
}
body.masked select {
visibility:hidden;
}
body.masked .ydlg select {
visibility:visible;
}
.ydlg{
z-index:10001;
overflow:hidden;
position:absolute;
left:300;top:0;
}
.yresizable-proxy{
z-index:10002;
}
.ydlg .ydlg-hd {
background: url(./images/default/basic-dialog/hd-sprite.gif) repeat-x 0 -82px;
background-color:navy;
color:#ffffff;
font:bold 12px "sans serif", tahoma, verdana, helvetica;
overflow:hidden;
padding:5px;
}
.ydlg .ydlg-hd-left {
background: url(./images/default/basic-dialog/hd-sprite.gif) no-repeat 0 -41px;
padding-left:3px;
margin:0px;
}
.ydlg .ydlg-hd-right {
background: url(./images/default/basic-dialog/hd-sprite.gif) no-repeat right 0;
padding-right:3px;
}
.ydlg .ydlg-dlg-body{
+<<<<<<< HEAD background:url(./images/default/layout/gradient-bg.gif);
+======= +>>>>>>> 0db1d5c8b18eadc4bd9cfc6603e86227fa94b5a9 border:1px solid #6593cf;
border-top:0 none;
padding:10px;
overflow:hidden;
}
.ydlg .ydlg-bd{
overflow:hidden;
}
.ydlg .ydlg-ft{
overflow:hidden;
padding:5px;
padding-bottom:0;
}
.ydlg .yui-ext-tabbody{
background:white;
overflow:auto;
}
.ydlg .ytabs-top .yui-ext-tabbody{
border:1px solid #6593cf;
border-top:0 none;
}
.ydlg .ytabs-bottom .yui-ext-tabbody{
border:1px solid #6593cf;
border-bottom:0 none;
}
.ydlg .ylayout-container .yui-ext-tabbody{
border:0 none;
}
.ydlg .inner-tab{
margin:5px;
}
.ydlg .ydlg-ft .ybtn{
margin-right:5px;
float:right;
clear:none;
}
.ydlg .ydlg-ft .ydlg-btns td {
border:0;
padding:0;
}
.ydlg .ydlg-ft .ydlg-btns-right table{
float:right;
clear:none;
}
.ydlg .ydlg-ft .ydlg-btns-left table{
float:left;
clear:none;
}
.ydlg .ydlg-ft .ydlg-btns-center{
text-align:center; /*ie*/
}
.ydlg .ydlg-ft .ydlg-btns-center table{
margin:0 auto; /*everyone else*/
}
.ydlg-draggable .ydlg-hd{
cursor:move;
}
.ydlg-closable .ydlg-hd{
padding-right:22px;
}
.ydlg .ydlg-close {
position:absolute;
top:4px;
right:4px;
z-index:6;
height:15px;
width:15px;
margin:0;
padding:0;
line-height:1px;
font-size:1px;
background-repeat:no-repeat;
cursor:pointer;
visibility:inherit;
background-image:url(./images/default/basic-dialog/close.gif);
}
.ydlg div.yresizable-handle-east{
background-image:url(./images/default/sizer/e-handle-dark.gif);
border:0;
background-position:left;
margin-right:0;
}
.ydlg div.yresizable-handle-south{
background-image:url(./images/default/sizer/s-handle-dark.gif);
border:0;
height:6px;
}
.ydlg div.yresizable-handle-west{
background-image:url(./images/default/sizer/e-handle-dark.gif);
border:0;
background-position:1px;
}
.ydlg div.yresizable-handle-north{
background-image:url(./images/default/s.gif);
border:0;
}
.ydlg div.yresizable-handle-northeast, .ytheme-gray .ydlg div.yresizable-handle-northeast{
background-image:url(./images/default/s.gif);
border:0;
}
.ydlg div.yresizable-handle-northwest, .ytheme-gray .ydlg div.yresizable-handle-northwest{
background-image:url(./images/default/s.gif);
border:0;
}
.ydlg div.yresizable-handle-southeast{
background-image:url(./images/default/sizer/corners-sprite.gif);
background-position: top left;
width:8px;
height:8px;
border:0;
}
.ydlg div.yresizable-handle-southwest{
background-image:url(./images/default/sizer/corners-sprite.gif);
background-position: top right;
margin-left:1px;
margin-bottom:1px;
border:0;
}
#mb-dlg .ydlg-ft .ybtn{
float:none;
clear:none;
margin:0 3px;
}
#mb-dlg .ydlg-bd {
padding:5px;
overflow:hidden !important;
}
#mb-dlg .ext-mb-input {
margin-top:4px;
width:95%;
}
#mb-dlg .ext-mb-textarea {
margin-top:4px;
font:normal 13px verdana,tahoma,sans-serif;
}
#mb-dlg .ext-mb-progress-wrap {
margin-top:4px;
border:1px solid #6593cf;
}
#mb-dlg .ext-mb-progress {
height:18px;
background:transparent url(./images/default/basic-dialog/progress2.gif) repeat-x 1px 1px;
}
#mb-dlg .ext-mb-progress-bar {
height:18px;
overflow:hidden;
width:0;
background:#8bb8f3;
}
diff --git a/frontend/beta/js/Clipperz/PM/DataModel/Record.js b/frontend/beta/js/Clipperz/PM/DataModel/Record.js index ecb6c37..d6ebb39 100644 --- a/frontend/beta/js/Clipperz/PM/DataModel/Record.js +++ b/frontend/beta/js/Clipperz/PM/DataModel/Record.js @@ -103,386 +103,392 @@ Clipperz.PM.DataModel.Record.prototype = MochiKit.Base.update(null, { //------------------------------------------------------------------------- 'key': function() { return this._key; }, 'updateKey': function() { this._key = Clipperz.PM.Crypto.randomKey(); }, //------------------------------------------------------------------------- 'label': function() { return this._label; }, 'setLabel': function(aValue) { this._label = aValue; }, 'lowerCaseLabel': function() { return this.label().toLowerCase(); }, //------------------------------------------------------------------------- 'versions': function() { return this._versions; }, //------------------------------------------------------------------------- 'currentVersion': function() { return this._currentVersion; }, 'setCurrentVersion': function(aValue) { this._currentVersion = aValue; }, //------------------------------------------------------------------------- 'currentVersionKey': function() { return this._currentVersionKey; }, 'setCurrentVersionKey': function(aValue) { this._currentVersionKey = aValue; }, //------------------------------------------------------------------------- 'deferredData': function() { var deferredResult; //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.deferredData - this: " + this); deferredResult = new MochiKit.Async.Deferred(); deferredResult.addCallback(MochiKit.Base.method(this, 'loadData')); deferredResult.addCallback(MochiKit.Base.method(this, 'decryptData')); deferredResult.addCallback(MochiKit.Base.method(this, 'processData')); deferredResult.addCallback(function(aRecord) { return aRecord.currentVersion().deferredData(); }); deferredResult.addCallback(MochiKit.Base.method(this, 'takeSnapshotOfCurrentData')); deferredResult.addCallback(MochiKit.Async.succeed, this); deferredResult.callback(); //MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.deferredData"); return deferredResult; }, //------------------------------------------------------------------------- 'exportedData': function() { var result; result = {}; result['label'] = this.label(); result['data'] = this.serializedData(); result['currentVersion'] = this.currentVersion().serializedData(); result['currentVersion']['reference'] = this.currentVersion().reference(); // result['versions'] = MochiKit.Base.map(MochiKit.Base.methodcaller("serializedData"), MochiKit.Base.values(this.versions())); return Clipperz.Base.serializeJSON(result); }, //------------------------------------------------------------------------- 'shouldLoadData': function() { return this._shouldLoadData; }, 'setShouldLoadData': function(aValue) { this._shouldLoadData = aValue; }, //------------------------------------------------------------------------- 'shouldDecryptData': function() { return this._shouldDecryptData; }, 'setShouldDecryptData': function(aValue) { this._shouldDecryptData = aValue; }, //------------------------------------------------------------------------- 'shouldProcessData': function() { return this._shouldProcessData; }, 'setShouldProcessData': function(aValue) { this._shouldProcessData = aValue; }, //------------------------------------------------------------------------- 'loadData': function() { var result; //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.loadData - this: " + this); if (this.shouldLoadData()) { var deferredResult; deferredResult = new MochiKit.Async.Deferred(); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'loadingRecordData'); deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'getRecordDetail', {reference: this.reference()}); deferredResult.addCallback(MochiKit.Base.method(this,'setServerData')); deferredResult.callback(); result = deferredResult; } else { result = MochiKit.Async.succeed(this.serverData()); } //MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.loadData"); return result; }, //------------------------------------------------------------------------- 'decryptData': function(anEncryptedData) { var result; //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.decryptData - this: " + this + " (" + anEncryptedData + ")"); if (this.shouldDecryptData()) { var deferredResult; deferredResult = new MochiKit.Async.Deferred(); deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'decryptingRecordData'); deferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt, this.key(), anEncryptedData['data'], anEncryptedData['version']); deferredResult.addCallback(function(anEncryptedData, someDecryptedValues) { var result; result = anEncryptedData; result['data'] = someDecryptedValues; return result; }, anEncryptedData); deferredResult.addCallback(MochiKit.Base.method(this, 'setDecryptedData')); deferredResult.callback(); result = deferredResult; } else { result = MochiKit.Async.succeed(this.decryptedData()); } //MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.decryptData"); return result; }, //------------------------------------------------------------------------- 'processData': function(someValues) { //MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Record.processData"); //MochiKit.Logging.logDebug("--- Record.processData: " + Clipperz.Base.serializeJSON(someValues)); if (this.shouldProcessData()) { var currentVersionParameters; console.log("Record.processData", someValues); this.processDataToExtractLegacyValues(someValues['data']); if (typeof(someValues['data']['notes']) != 'undefined') { this.setNotes(someValues['data']['notes']); } if (someValues['data']['currentVersionKey'] != null) { this.setCurrentVersionKey(someValues['data']['currentVersionKey']); } else { this.setCurrentVersionKey(this.key()); } -// currentVersionParameters = someValues['currentVersion']; - currentVersionParameters = someValues['versions'][someValues['currentVersion']]; +// community edition doesn't currently pass version +// information + if (someValues['versions'] == null) { + currentVersionParameters = someValues['currentVersion']; + } else { + currentVersionParameters = someValues['versions'][someValues['currentVersion']]; + } + console.log("Record.processData - this.currentVersionKey()", this.currentVersionKey()); console.log("Record.processData - currentVersionParameters", currentVersionParameters); currentVersionParameters['key'] = this.currentVersionKey(); this.setCurrentVersion(new Clipperz.PM.DataModel.RecordVersion(this, currentVersionParameters)); if (someValues['data']['directLogins'] != null) { var directLoginReference; for (directLoginReference in someValues['data']['directLogins']) { var directLogin; var directLoginParameters; directLoginParameters = someValues['data']['directLogins'][directLoginReference]; directLoginParameters.record = this; directLoginParameters.reference = directLoginReference; directLogin = new Clipperz.PM.DataModel.DirectLogin(directLoginParameters); this.addDirectLogin(directLogin, true); } } this.setShouldProcessData(false); } Clipperz.NotificationCenter.notify(this, 'recordDataReady'); //MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Record.processData"); //MochiKit.Logging.logDebug("<<< Record.processData"); return this; }, //------------------------------------------------------------------------- 'processDataToExtractLegacyValues': function(someValues) { //MochiKit.Logging.logDebug(">>> Record.processDataToExtractLegacyValues"); if (someValues['data'] != null) { this.setNotes(someValues['data']); } if ( (typeof(someValues['loginFormData']) != "undefined") && (typeof(someValues['loginBindings'] != "undefined")) && (someValues['loginFormData'] != "") && (someValues['loginBindings'] != "") ) { var directLogin; directLogin = new Clipperz.PM.DataModel.DirectLogin({ record:this, label:this.label() + Clipperz.PM.Strings['newDirectLoginLabelSuffix'], reference:Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(this.label() + someValues['loginFormData'] + someValues['loginBindings'])).toHexString().substring(2), formData:Clipperz.Base.evalJSON(someValues['loginFormData']), legacyBindingData:Clipperz.Base.evalJSON(someValues['loginBindings']), bookmarkletVersion:'0.1' }); this.addDirectLogin(directLogin, true); } //MochiKit.Logging.logDebug("<<< Record.processDataToExtractLegacyValues"); }, //------------------------------------------------------------------------- 'getReadyBeforeUpdatingVersionValues': function() { }, //------------------------------------------------------------------------- 'addNewField': function() { var newField; //MochiKit.Logging.logDebug(">>> Record.addNewField - " + this); this.getReadyBeforeUpdatingVersionValues(); newField = this.currentVersion().addNewField(); Clipperz.NotificationCenter.notify(this, 'recordUpdated'); //MochiKit.Logging.logDebug("<<< Record.addNewField"); return newField; }, //------------------------------------------------------------------------- 'removeField': function(aField) { this.getReadyBeforeUpdatingVersionValues(); this.currentVersion().removeField(aField); Clipperz.NotificationCenter.notify(this, 'recordUpdated'); }, 'removeEmptyFields': function() { MochiKit.Iter.forEach(MochiKit.Base.values(this.currentVersion().fields()), MochiKit.Base.bind(function(aField) { if (aField.isEmpty()) { this.removeField(aField); // this.currentVersion().removeField(aField); } }, this)); }, //------------------------------------------------------------------------- 'notes': function() { return this._notes; }, 'setNotes': function(aValue) { this._notes = aValue; this.setHeaderNotes(null); }, //------------------------------------------------------------------------- 'headerNotes': function() { return this._headerNotes; }, 'setHeaderNotes': function(aValue) { this._headerNotes = aValue; }, //------------------------------------------------------------------------- 'remove': function() { //MochiKit.Logging.logDebug(">>> Record.remove - " + this); MochiKit.Iter.forEach(MochiKit.Base.values(this.directLogins()), MochiKit.Base.method(this, 'removeDirectLogin')); this.syncDirectLoginReferenceValues(); this.user().removeRecord(this); //MochiKit.Logging.logDebug("<<< Record.remove"); }, //------------------------------------------------------------------------- 'directLogins': function() { return this._directLogins; }, 'addDirectLogin': function(aDirectLogin, shouldUpdateUser) { this.directLogins()[aDirectLogin.reference()] = aDirectLogin; if (shouldUpdateUser == true) { this.user().addDirectLogin(aDirectLogin); } }, 'removeDirectLogin': function(aDirectLogin) { this.removedDirectLogins().push(aDirectLogin); delete this.directLogins()[aDirectLogin.reference()]; // this.user().removeDirectLogin(aDirectLogin); }, 'resetDirectLogins': function() { this._directLogins = {}; }, 'removedDirectLogins': function() { return this._removedDirectLogins; }, 'resetRemovedDirectLogins': function() { this._removedDirectLogins = []; }, //------------------------------------------------------------------------- 'serverData': function() { return this._serverData; }, 'setServerData': function(aValue) { this._serverData = aValue; this.setShouldLoadData(false); return aValue; }, //------------------------------------------------------------------------- 'decryptedData': function() { return this._decryptedData; }, 'setDecryptedData': function(aValue) { this._decryptedData = aValue; this.setShouldDecryptData(false); return aValue; }, //------------------------------------------------------------------------- 'cachedData': function() { return this._cachedData; }, 'setCachedData': function(aValue) { //MochiKit.Logging.logDebug(">>> Record.setCachedData"); diff --git a/frontend/beta/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/beta/js/Clipperz/PM/Strings/Strings_en-US.js index 9fa95e9..299ebc7 100644 --- a/frontend/beta/js/Clipperz/PM/Strings/Strings_en-US.js +++ b/frontend/beta/js/Clipperz/PM/Strings/Strings_en-US.js @@ -319,385 +319,385 @@ Clipperz.PM.Strings.Languages['en-us'] = { 'loginHistoryReadOnlyMessage': "\ <h6>Sorry!</h6>\ <p>The login history is not available while using the offline version of Clipperz.</p>", 'loginHistoryLoadingMessage': "\ <h6>Loading data</h6>\ <p>Please wait …</p>", 'loginHistoryLoadedMessage': "\ <h6>Your latest 10 logins</h6>\ <p></p>", 'loginHistoryIPLabel': "IP", 'loginHistoryTimeLabel': "date", 'loginHistoryCurrentSessionText': "current session", 'loginHistoryReloadButtonLabel': "Reload login history", // Account panel - delete account 'deleteAccountTabLabel': "Delete your account", 'deleteAccountTabTitle': "Delete your account", 'deleteAccountFormUsernameLabel': "username", 'deleteAccountFormPassphraseLabel': "passphrase", 'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.", 'deleteAccountFormSubmitLabel': "Delete my account", //Account panel - delete account - warnings 'deleteAccountFormWrongUsernameWarning': "Wrong username", 'deleteAccountFormWrongPassphraseWarning': "Wrong passphrase", 'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.", //Account panel - delete account - confirmation 'accountPanelDeletingAccountPanelConfirmationTitle': "ATTENTION", 'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?", 'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes", 'accountPanelDeleteAccountPanelDenyButtonLabel': "No", //Account panel - delete account - confirmation 'accountPanelDeletingAccountPanelProgressTitle': "Deleting the account data", 'accountPanelDeletingAccountPanelProgressText': "The operation could take long, please be patient.", //Data panel - offline copy 'offlineCopyTabLabel': "Offline copy", 'offlineCopyTabTitle': "Offline copy", 'offlineCopyTabDescription': "\ <!-- FIX CSS DONE! --> \ <p>With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet.</p>\ <p>The read-only version is as secure as the read-and-write one and will not expose your data to higher risks since they both share the same code and security architecture.</p>\ <ol>\ <li><p>Click the link below to start the download.</p></li>\ <li><p>The browser will ask you what to do with the “Clipperz_YYYYMMDD.html” file. Save it on your hard disk.</p></li>\ <li><p>Double click on the downloaded file to launch the offline version in your browser.</p></li>\ <li><p>Enter the usual username and passphrase.</p></li>\ </ol>", 'offlineCopyDownloadLinkLabel': "Download", // Data panel - offline copy - not updated 'offlineCopyDownloadWarning': "\ <!-- FIX CSS DONE! --> \ <h4><a href=\"#\" id=\"offlineCopyDownloadWarningLink\">Update your “offline copy”!</a></h4>\ <p>You have recently created or modified one or more cards, it would be wise to download a new copy of the offline version.</p>", 'offlineCopyDownloadOk': "", // Data panel - sharing 'sharingTabLabel': "Sharing", 'sharingTabTitle': "Sharing", 'sharingTabDescription': "\ <p>Quite often a confidential piece of information needs to be shared with one or more persons.</p>\ <p>This could be as simple as giving your colleague the access code of your voice mailbox when you are out of the office, or as complicated as enabling the entitled heirs to access your safe deposit box at the local bank when you pass on.</p>\ <p>Clipperz can make sharing your secrets a secure and straightforward process.</p>\ <p></p>\ <p><b>Coming soon …</b></p>", // Data panel - import 'importTabLabel': "Import", 'importTabTitle': "Import", 'importTabDescription': "<p>You can bulk import data to your Clipperz account from several file formats.</p>", // Data panel - export 'printingTabLabel': "Export", 'printingTabTitle': "Export", 'printingTabDescription': "\ <h5>Printing</h5>\ <p>Click on the link below to open a new window displaying all your cards in a printable format.</p>\ <p>If you are going to print for backup purposes, please consider the safer option provided by the “offline copy”.</p>", 'printingLinkLabel': "Printable version", 'exportTabDescription': "\ <h5>Exporting to JSON</h5>\ <p>JSON enables a “lossless” export of your cards. All the information will be preserved, including direct login configurations.</p>\ <p>This custom format it’s quite convenient if you need to move some of all of your cards to a different Clipperz account. Or if you want to restore a card that has been accidentally deleted.</p>\ <p>Click on the link below to start the export process.</p>", 'exportLinkLabel': "Export to JSON", 'exportDataInProgressDescription': "<h4>Exporting, please wait while your data are being processed …</h4>", 'exportDataDescription': "\ <h4>Instructions</h4>\ <p>Copy the text below to your favorite editor and save it. (e.g. “clipperz_export_20071217.json”)</p>", // Contacts panel 'contactsTabLabel': "Contacts", 'contactsTabTitle': "Contacts", //Tools panel - password generator 'passwordGeneratorTabLabel': "Password generator", 'bookmarkletTabLabel': "Bookmarklet", 'compactTabLabel': "Compact edition", 'httpAuthTabLabel': "HTTP authentication", 'passwordGeneratorTabTitle': "Password generator", 'bookmarkletTabTitle': "Bookmarklet", 'compactTabTitle': "Compact edition", 'httpAuthTabTitle': "HTTP authentication", // Tools panel - password generator - description 'paswordGeneratorTabDescription': "<p></p>", 'passwordGeneratorTabButtonLabel': "Generate password", // Tools panel - bookmarklet 'bookmarkletTabLabel': "Bookmarklet", 'bookmarkletTabTitle': "Bookmarklet", 'bookmarkletTabDescription': "\ <!-- FIX CSS DONE! --> \ <p>A bookmarklet is a simple “one-click” tool that can perform very useful tasks. It can be saved and used like a normal web page bookmark.</p>\ <p>The Clipperz bookmarklet will help you to quickly create new cards and new “direct logins” within existing cards.</p>\ <p><b>Please note that the bookmarklet does not include any information related to your account (e.g. your username or passphrase), the bookmarklet is a general tool containing the same code for every Clipperz user.</b></p>\ <h3>How to install the bookmarklet</h3>\ <h>Firefox, Camino, Opera, Safari</h5>\ <ol>\ <li><p>Make sure that the “Bookmarks Bar” is displayed by selecting “View > Toolbars > Bookmarks”, or similar menu items, from the browser menu.</p></li>\ <li><p>Drag and drop the “Add to Clipperz” link below to the bookmark bar.</p></li>\ </ol>\ \ <h5>Internet Explorer</h5>\ <ol>\ <li><p>Make sure that the “Links” toolbar is displayed by selecting “View > Toolbars > Links” from the browser menu.</p></li>\ <li><p>Right-click on the “Add to Clipperz” link below.</p></li>\ <li><p>Select “Add to favorites” from the contextual menu.</p></li>\ <li><p>Click “Yes” for any security message that pops up.</p></li>\ <li><p>Open the “Links” folder and click “OK”</p></li>\ </ol>", 'bookmarkletTabBookmarkletTitle': "Add to Clipperz", // Tools panel - bookmarklet - instructions 'bookmarkletTabInstructions': "\ <!-- FIX CSS DONE! --> \ <h3>How to create a new card inclusive of a “direct login” link to an online service</h3>\ <ol>\ <li><p>Open the web page where the login form is hosted. (this is the page where you usually enter your sign-in credentials)</p></li>\ <li><p>Launch the bookmarklet by clicking on it: a pop-up window will appear over the web page.</p></li>\ <li><p>Copy to the clipboard the content of the large text area within the pop-up. (ctrl-C)</p></li>\ <li><p>Enter your Clipperz account and click on the <b>Add new card</b> button.</p></li>\ <li><p>Select the “Direct login” template and paste the content of the clipboard to the large text area in the form. (ctrl-V)</p></li>\ <li><p>Press the <b>Create</b> button, complete and review the details, then click <b>Save</b>.</p></li>\ </ol>\ \ <h3>How to add a “direct login” link to an existing card</h3>\ <ol>\ <li><p>Same as above.</p></li>\ <li><p>Same as above.</p></li>\ <li><p>Same as above.</p></li>\ <li><p>Enter your Clipperz account and select the card containing the credentials for the web service you just visited and click the <b>Edit</b> button.</p></li>\ <li><p>Paste the content of the clipboard to the large text area in the “Direct logins” section. (ctrl-V)</p></li>\ <li><p>Press the <b>Add direct login</b> button, review the details and then click <b>Save</b>.</p></li>\ </ol>\ \ <p></p>\ <p>Further information about the bookmarklet are <a href=\"http://www.clipperz.com/support/user_guide/bookmarklet\" target=\"_blank\">available here</a>.</p>", // Tools panel - Compact - instructions 'compactTabDescription': "\ <!-- FIX CSS DONE! --> \ <p>Clipperz Compact is a special version of Clipperz designed to be opened in the Firefox sidebar.</p>\ <p>Its purpose is to keep your collection of “direct logins” always at hand. Read more <a href=\"http://www.clipperz.com/support/user_guide/clipperz_compact\", target=\"blank\">here</a></p>\ \ <h3>How to launch Clipperz Compact in the sidebar</h3>\ <ol>\ <li><p>Get Firefox! Sidebars are only available in Firefox and you need to switch to Firefox in order to enjoy the convenience of Clipperz Compact.</p></li>\ <li>\ <p>Add the following URL to Firefox bookmarks, or even better, drag it to the bookmark bar.</p>\ - <div id=\"compactLinkBox\"><a href=\"https://www.clipperz.com/beta/index.html?compact\" target=\"_search\">Clipperz Compact</a></div>\ + <div id=\"compactLinkBox\"><a href=\"index.html?compact\" target=\"_search\">Clipperz Compact</a></div>\ </li>\ <li><p>Change the properties of the bookmark so that “load this bookmark in the sidebar” is checked.</p></li>\ </ol>\ \ <h5>Added bonus: Clipperz Compact works also in Opera’s panel.</h5>", // Tools panel - HTTP authentication - instructions 'httpAuthTabDescription': "\ <!-- FIX CSS DONE! --> \ <p>HTTP authentication is a method designed to allow a web browser to provide credentials – in the form of a username and password – including them in a website address (HTTP or HTTPS URL).</p>\ <p>Nowadays it is rarely used, but it can still be found on small, private websites. You can tell that a website is protected by HTTP authentication when the browser displays a pop-up window to enter username and password.</p>\ <p>Unfortunately the Clipperz bookmarklet does not work on websites that use HTTP authentication. However you can still create a “direct login”.</p>\ \ <h3>How to create a “direct login” for a website that uses HTTP authentication</h3>\ <ol>\ <li><p>Store website URL, username and password in a new card.</p></li>\ <li><p>Copy the configuration below and paste it to the large text area in the “Direct logins” section of the new card.</p></li>\ <li><p>Press the <b>Add direct login</b> button, bind URL, username and password fields and then click <b>Save</b>.</p></li>\ </ol>\ \ <h5><a href=\"http://support.microsoft.com/kb/834489\" target=\"_blank\">Warning: Internet Explorer does not support HTTP authentication.</a></h5>", // Direct logins block 'mainPanelDirectLoginBlockLabel': "Direct logins", 'directLinkReferenceShowButtonLabel': "show", // Direct logins - blank slate 'mainPanelDirectLoginBlockDescription': "\ <!-- FIX CSS DONE! --> \ <p>Add “direct logins” to sign in to your web accounts without typing usernames and passwords!</p>\ <p>“Direct logins” greatly enhance your password security since you can:</p>\ <ul>\ <li><p>conveniently adopt and enter complex passwords;</p></li>\ <li><p>never re-use the same and easy-to-guess password.</p></li>\ </ul>\ <p>Simple and quick configuration with the <b>Clipperz bookmarklet</b>.</p>\ <a href=\"http://www.clipperz.com/support/user_guide/direct_logins\" target=\"_blank\">Learn more about “direct logins”</a>", // Cards block 'mainPanelRecordsBlockLabel': "Cards", 'mainPanelAddRecordButtonLabel': "Add new card", 'mainPanelRemoveRecordButtonLabel': "Delete card", // Cards block - filter tabs 'mainPanelRecordFilterBlockAllLabel': "all", 'mainPanelRecordFilterBlockTagsLabel': "tags", 'mainPanelRecordFilterBlockSearchLabel': "search", // Cards block - blank slate 'recordDetailNoRecordAtAllTitle': "Welcome to Clipperz!", 'recordDetailNoRecordAtAllDescription': "\ <h5>Get started by adding cards to your account.</h5>\ <p>Cards are simple and flexible forms where you can store your passwords and any other confidential data.</p>\ <p>Cards could contain credentials for accessing a web site, the combination of your bicycle lock, details of your credit card, …</p>\ \ <h5>Don't forget the Clipperz bookmarklet!</h5>\ <p>Before you start, install the “Add to Clipperz” bookmarklet: it will make creating cards easier and more fun.</p>\ <p>Go to the “Tools” tab to discover how to install it and how it use it.</p>\ <p></p>\ <p>Then simply click the <b>\"Add new card\"</b> button and enjoy your Clipperz account.</p>\ <p></p>\ <a href=\"http://www.clipperz.com/support/user_guide/managing_cards\" target=\"_blank\">Learn more about creating and managing cards</a>", // Cards block - new card wizard - bookmarklet configuration 'newRecordWizardTitleBox': "\ <h5>Please select a template</h5>\ <p>Cards are simple and flexible forms where you can store passwords or any other confidential data.</p>\ <p>Start choosing one of the templates below. You can always customize your cards later by adding or removing fields.</p>", 'newRecordWizardBookmarkletConfigurationTitle': "Direct login", 'newRecordWizardBookmarkletConfigurationDescription': "\ <p>Paste below the configuration code generated by the Clipperz bookmarklet.</p>\ <p>A new card complete with a direct login to your web account will be created.</p>", 'newRecordWizardCreateButtonLabel': "Create", 'newRecordWizardCancelButtonLabel': "Cancel", // Create new card - Donation splash 'donateSplashPanelTitle': "Support Clipperz, make a donation today!", 'donateSplashPanelDescription': "\ <!-- FIX CSS DONE! --> \ <p>A few good reasons to make a donation:</p>\ <ul>\ <li><p>support the development of new features</p></li>\ <li><p>keep Clipperz free</p></li>\ <li><p>show appreciation for our hard work</p></li>\ </ul>\ <p>For any further information, please visit our <a href=\"http://www.clipperz.com/donations\" target=\"_blank\">Donations page</a>.</p>\ <p><b>Ready to donate?</b></p>", 'donateCloseButtonLabel': "Not yet", 'donateDonateButtonLabel': "Yes", // Card templates 'recordTemplates': { //Web password 'WebAccount': { 'title': "Web password", 'description': "<p>A simple card to store login credentials for your online services.</p>", 'fields': [ {label:"Web address", type:'URL'}, {label:"Username or email", type:'TXT'}, {label:"Password", type:'PWD'} ] }, //Bank account 'BankAccount': { 'title': "Bank account", 'description': "<p>Safely store your bank account number and online banking credentials.</p>", 'fields': [ {label:"Bank", type:'TXT'}, {label:"Account number", type:'TXT'}, {label:"Bank website", type:'URL'}, {label:"Online banking ID", type:'TXT'}, {label:"Online banking password", type:'PWD'} ] }, // Credit card 'CreditCard': { 'title': "Credit card", 'description': "<p>Card number, expire date, CVV2 and PIN always at hand with Clipperz.</p>", 'fields': [ {label:"Type (Visa, AmEx, …)", type:'TXT'}, {label:"Number", type:'TXT'}, {label:"Owner name", type:'TXT'}, {label:"Expiry date", type:'TXT'}, {label:"CVV2", type:'TXT'}, {label:"PIN", type:'PWD'}, {label:"Card website", type:'URL'}, {label:"Username", type:'TXT'}, {label:"Password", type:'PWD'} ] }, // Address book entry 'AddressBookEntry': { 'title': "Address book entry", 'description': "<p>Clipperz could also work as your new private address book. Use this template to easily add a new entry.</p>", 'fields': [ {label:"Name", type:'TXT'}, {label:"Email", type:'TXT'}, {label:"Phone", type:'TXT'}, {label:"Mobile", type:'TXT'}, {label:"Address", type:'ADDR'}, ] }, //Custom card 'Custom': { 'title': "Custom card", 'description': "<p>No matter which kind of confidential data you need to protect, create a custom card to match your needs.</p>", 'fields': [ {label:"Label 1", type:'TXT'}, {label:"Label 2", type:'TXT'}, {label:"Label 3", type:'TXT'} ] } }, 'recordFieldTypologies': { 'TXT': { description: "simple text field", shortDescription: "text" }, 'PWD': { description: "simple text field, with default status set to hidden", shortDescription: "password" }, 'URL': { description: "simple text field in edit mode, that became an active url in view mode", shortDescription: "web address" }, 'DATE': { description: "a value set with a calendar helper", shortDescription: "date" }, 'ADDR': { description: "just like the URL, but the active link points to Google Maps (or similar service) passing the address value as argument", shortDescription: "street address" }, 'CHECK': { description: "check description", shortDescription: "check" }, 'RADIO': { description: "radio description", shortDescription: "radio" }, diff --git a/scripts/builder/repository.py b/scripts/builder/repository.py index a47e249..7ac2324 100644 --- a/scripts/builder/repository.py +++ b/scripts/builder/repository.py @@ -1,88 +1,97 @@ #!/usr/bin/env python # -*- coding: UTF-8 -*- def repositoryWithPath (path): try: from mercurial import ui, hg repo = hg.repository(ui.ui(), path) result = HgRepository(repo, path) except: try: from git import Repo - repo = Repo(path) result = GitRepository(repo, path) + except ImportError, exception: print "Failed to import git, please install http://gitorious.org/git-python" raise exception + except: + result = SnapshotRepository('', path) return result #=================================================================== class Repository(object): def __init__ (self, repository, path): self.repository = repository self.path = path def revision (self): raise NotImplementedError() def areTherePendingChanges (self): raise NotImplementedError() def version (self): result = self.revision() if self.areTherePendingChanges(): result = '>>> ' + result + ' <<<' # print "VERSION: " + result return result #=================================================================== class GitRepository(Repository): # http://gitorious.org/git-python def revision (self): try: return self.repository.head.commit.hexsha except: return self.repository.commits()[0].id def areTherePendingChanges (self): try: return self.repository.is_dirty() except TypeError, te: return self.repository.is_dirty #=================================================================== class HgRepository(Repository): # http://mercurial.selenic.com/wiki/MercurialApi def revision (self): return 'hg:' + str(self.repository['tip']) def areTherePendingChanges (self): # TODO: FIXME: repository.status() does not report 'unknown(?)' files. :( return not all(map(lambda fileList: len(fileList) == 0, self.repository.status())) #=================================================================== + +class SnapshotRepository(Repository): + def revision (self): + return 'SNAPSHOT' + + def areTherePendingChanges (self): + return False |