mirror of
https://github.com/seiichiro0185/sailotp.git
synced 2024-11-24 16:19:43 +00:00
Version 0.5
Added Export / Import for the Token Database
This commit is contained in:
parent
365dafdb4f
commit
a19c48e5f3
16 changed files with 1620 additions and 683 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
# User Specific Project Files
|
# User Specific Project Files
|
||||||
*.pro.user
|
*.pro.user
|
||||||
*.pro.user.*
|
*.pro.user.*
|
||||||
|
rpm/harbour-sailotp.spec
|
||||||
|
|
14
README.md
14
README.md
|
@ -22,6 +22,16 @@ The item can be unstared by tapping the star icon again on the main view.
|
||||||
|
|
||||||
From the main view a token can be copied to the clipboard by tapping on it.
|
From the main view a token can be copied to the clipboard by tapping on it.
|
||||||
|
|
||||||
|
From the pulley menu the token database can be exported to a file for backup purposes. The backup is a AES-256-CBC encrypted and
|
||||||
|
Base64 encoded file containing a JSON-representation of the database. It can be decrypted with openssl using the following command:
|
||||||
|
|
||||||
|
openssl enc -d -a -aes-256-cbc -in <file>
|
||||||
|
|
||||||
|
if you need the information outside of SailOTP.
|
||||||
|
|
||||||
|
Importing the file is also possible from the pulley menu. If a file contains tokens that are already in the database
|
||||||
|
(title and secret of the token match an existing one), these tokens will not be added again.
|
||||||
|
|
||||||
## Known Limitations
|
## Known Limitations
|
||||||
|
|
||||||
At the moment the only way to insert new entries into the app is to insert the
|
At the moment the only way to insert new entries into the app is to insert the
|
||||||
|
@ -43,6 +53,10 @@ SailOTP uses the SHA-1 and HMAC-Implementation from
|
||||||
|
|
||||||
<a href="https://github.com/Caligatio/jsSHA" target="_blank">https://github.com/Caligatio/jsSHA</a>
|
<a href="https://github.com/Caligatio/jsSHA" target="_blank">https://github.com/Caligatio/jsSHA</a>
|
||||||
|
|
||||||
|
SailOTP also uses the AES-Implementation from
|
||||||
|
|
||||||
|
<a href="https://github.com/mdp/gibberish-aes" target="_blank">https://github.com/mdp/gibberish-aes</a>
|
||||||
|
|
||||||
The implementation of the TOTP-algorithm was inspired by:
|
The implementation of the TOTP-algorithm was inspired by:
|
||||||
|
|
||||||
<a href="http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/" target="_blank">http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/</a>
|
<a href="http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/" target="_blank">http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/</a>
|
||||||
|
|
|
@ -8,9 +8,13 @@
|
||||||
# - icon definition filename in desktop file must be changed
|
# - icon definition filename in desktop file must be changed
|
||||||
TARGET = harbour-sailotp
|
TARGET = harbour-sailotp
|
||||||
|
|
||||||
|
DEFINES += APP_VERSION=\\\"$$VERSION\\\"
|
||||||
|
DEFINES += APP_BUILDNUM=\\\"$$RELEASE\\\"
|
||||||
|
|
||||||
CONFIG += sailfishapp
|
CONFIG += sailfishapp
|
||||||
|
|
||||||
SOURCES += src/harbour-sailotp.cpp
|
SOURCES += src/harbour-sailotp.cpp \
|
||||||
|
src/fileio.cpp
|
||||||
|
|
||||||
OTHER_FILES += qml/harbour-sailotp.qml \
|
OTHER_FILES += qml/harbour-sailotp.qml \
|
||||||
qml/cover/CoverPage.qml \
|
qml/cover/CoverPage.qml \
|
||||||
|
@ -23,5 +27,11 @@ OTHER_FILES += qml/harbour-sailotp.qml \
|
||||||
qml/lib/storage.js \
|
qml/lib/storage.js \
|
||||||
qml/lib/crypto.js \
|
qml/lib/crypto.js \
|
||||||
qml/lib/sha.js \
|
qml/lib/sha.js \
|
||||||
qml/sailotp.png
|
qml/sailotp.png \
|
||||||
|
qml/pages/ExportPage.qml \
|
||||||
|
qml/lib/gibberish-aes.js \
|
||||||
|
qml/components/NotifyBanner.qml
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
src/fileio.h
|
||||||
|
|
||||||
|
|
|
@ -1,529 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE QtCreatorProject>
|
|
||||||
<!-- Written by QtCreator 2.8.1, 2014-01-05T21:44:53. -->
|
|
||||||
<qtcreator>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.ActiveTarget</variable>
|
|
||||||
<value type="int">1</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.EditorSettings</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
|
|
||||||
<value type="QString" key="language">Cpp</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QString" key="CurrentPreferences">CppGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
|
|
||||||
<value type="QString" key="language">QmlJS</value>
|
|
||||||
<valuemap type="QVariantMap" key="value">
|
|
||||||
<value type="QString" key="CurrentPreferences">QmlJSGlobal</value>
|
|
||||||
</valuemap>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
|
|
||||||
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
|
|
||||||
<value type="int" key="EditorConfiguration.IndentSize">4</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
|
|
||||||
<value type="int" key="EditorConfiguration.TabSize">8</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
|
|
||||||
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
|
|
||||||
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.PluginSettings</variable>
|
|
||||||
<valuemap type="QVariantMap"/>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.0</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">MerSDK-SailfishOS-armv7hl</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">MerSDK-SailfishOS-armv7hl</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{45efb901-3e2e-4d50-95ba-c432b8781a69}</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
|
|
||||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/seiichiro/Projekte/Sailfish/build-harbour-sailotp-MerSDK_SailfishOS_armv7hl-Debug</value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
|
|
||||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/seiichiro/Projekte/Sailfish/build-harbour-sailotp-MerSDK_SailfishOS_armv7hl-Release</value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Rpm</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRpmBuildStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy By Building An RPM Package</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerArmDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Rsync</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRsyncDeployStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy By Copying Binaries</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRSyncDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.2">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Rpm</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRpmDeployStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy As RPM Package</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRpmDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">3</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Project.UseGlobal">true</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
|
||||||
<value type="int">0</value>
|
|
||||||
<value type="int">1</value>
|
|
||||||
<value type="int">2</value>
|
|
||||||
<value type="int">3</value>
|
|
||||||
<value type="int">4</value>
|
|
||||||
<value type="int">5</value>
|
|
||||||
<value type="int">6</value>
|
|
||||||
<value type="int">7</value>
|
|
||||||
<value type="int">8</value>
|
|
||||||
<value type="int">9</value>
|
|
||||||
<value type="int">10</value>
|
|
||||||
<value type="int">11</value>
|
|
||||||
<value type="int">12</value>
|
|
||||||
<value type="int">13</value>
|
|
||||||
<value type="int">14</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">1</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">harbour-sailotp (auf Mobilgerät)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRunConfiguration:/home/seiichiro/Projekte/Sailfish/harbour-sailotp/harbour-sailotp.pro</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.Arguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.ProFile">harbour-sailotp.pro</value>
|
|
||||||
<value type="QString" key="RemoteLinux.RunConfig.AlternateRemoteExecutable"></value>
|
|
||||||
<value type="bool" key="RemoteLinux.RunConfig.UseAlternateRemoteExecutable">false</value>
|
|
||||||
<value type="QString" key="RemoteLinux.RunConfig.WorkingDirectory"></value>
|
|
||||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Target.1</variable>
|
|
||||||
<valuemap type="QVariantMap">
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">MerSDK-SailfishOS-i486-x86</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">MerSDK-SailfishOS-i486-x86</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{08e6ddb6-6d52-4f4e-938d-998fac04baad}</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
|
|
||||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/seiichiro/Projekte/Sailfish/build-harbour-sailotp-MerSDK_SailfishOS_i486_x86-Debug</value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
|
|
||||||
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
|
|
||||||
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
|
|
||||||
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
|
|
||||||
<value type="QString">-w</value>
|
|
||||||
<value type="QString">-r</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Bereinigen</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
|
|
||||||
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Release</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
|
|
||||||
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/seiichiro/Projekte/Sailfish/build-harbour-sailotp-MerSDK_SailfishOS_i486_x86-Release</value>
|
|
||||||
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Start Emulator</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerEmulatorStartStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Rsync</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRsyncDeployStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy By Copying Binaries</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRSyncDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.1">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Start Emulator</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerEmulatorStartStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
|
|
||||||
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Rpm</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRpmDeployStep</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deployment</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy As RPM Package</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRpmDeployConfiguration</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.DeployConfigurationCount">2</value>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.PluginSettings"/>
|
|
||||||
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.0">
|
|
||||||
<value type="bool" key="Analyzer.Project.UseGlobal">true</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
|
|
||||||
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
|
|
||||||
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
|
|
||||||
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
|
|
||||||
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
|
|
||||||
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
|
|
||||||
<value type="int">0</value>
|
|
||||||
<value type="int">1</value>
|
|
||||||
<value type="int">2</value>
|
|
||||||
<value type="int">3</value>
|
|
||||||
<value type="int">4</value>
|
|
||||||
<value type="int">5</value>
|
|
||||||
<value type="int">6</value>
|
|
||||||
<value type="int">7</value>
|
|
||||||
<value type="int">8</value>
|
|
||||||
<value type="int">9</value>
|
|
||||||
<value type="int">10</value>
|
|
||||||
<value type="int">11</value>
|
|
||||||
<value type="int">12</value>
|
|
||||||
<value type="int">13</value>
|
|
||||||
<value type="int">14</value>
|
|
||||||
</valuelist>
|
|
||||||
<value type="int" key="PE.EnvironmentAspect.Base">1</value>
|
|
||||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">harbour-sailotp (auf Mobilgerät)</value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
|
|
||||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MerRunConfiguration:/home/seiichiro/Projekte/Sailfish/harbour-sailotp/harbour-sailotp.pro</value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.Arguments"></value>
|
|
||||||
<value type="QString" key="Qt4ProjectManager.MaemoRunConfiguration.ProFile">harbour-sailotp.pro</value>
|
|
||||||
<value type="QString" key="RemoteLinux.RunConfig.AlternateRemoteExecutable"></value>
|
|
||||||
<value type="bool" key="RemoteLinux.RunConfig.UseAlternateRemoteExecutable">false</value>
|
|
||||||
<value type="QString" key="RemoteLinux.RunConfig.WorkingDirectory"></value>
|
|
||||||
<value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebugger">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">true</value>
|
|
||||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">false</value>
|
|
||||||
</valuemap>
|
|
||||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
|
|
||||||
</valuemap>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.TargetCount</variable>
|
|
||||||
<value type="int">2</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
|
|
||||||
<value type="QByteArray">{ea1259ba-c840-46cd-876a-b91d58edff1f}</value>
|
|
||||||
</data>
|
|
||||||
<data>
|
|
||||||
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
|
|
||||||
<value type="int">14</value>
|
|
||||||
</data>
|
|
||||||
</qtcreator>
|
|
83
qml/components/NotifyBanner.qml
Normal file
83
qml/components/NotifyBanner.qml
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013, Stefan Brand <seiichiro@seiichiro0185.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The names of the contributors may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||||
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
import Sailfish.Silica 1.0
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: notifyBanner
|
||||||
|
width: Screen.width
|
||||||
|
height: notifyText.height + 2*Theme.paddingMedium
|
||||||
|
visible: showBanner
|
||||||
|
|
||||||
|
property bool showBanner: false
|
||||||
|
|
||||||
|
function show(text, time) {
|
||||||
|
notifyText.text = text;
|
||||||
|
timeout.interval = time;
|
||||||
|
showBanner = true;
|
||||||
|
timeout.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer {
|
||||||
|
id: timeout
|
||||||
|
interval: 3000
|
||||||
|
onTriggered: {
|
||||||
|
interval = 3000
|
||||||
|
showBanner = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
id: banner
|
||||||
|
anchors.fill: parent
|
||||||
|
color: Theme.secondaryHighlightColor
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: notifyText
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.margins: Theme.paddingLarge
|
||||||
|
|
||||||
|
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.primaryColor
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
elide: Text.ElideRight
|
||||||
|
maximumLineCount: 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onClicked: {
|
||||||
|
showBanner = false
|
||||||
|
timeout.stop()
|
||||||
|
timeout.interval = 3000
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,7 @@
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import Sailfish.Silica 1.0
|
import Sailfish.Silica 1.0
|
||||||
import "pages"
|
import "pages"
|
||||||
|
import "components"
|
||||||
|
|
||||||
ApplicationWindow
|
ApplicationWindow
|
||||||
{
|
{
|
||||||
|
@ -41,6 +42,8 @@ ApplicationWindow
|
||||||
property string coverType: ""
|
property string coverType: ""
|
||||||
property string coverOTP: "------"
|
property string coverOTP: "------"
|
||||||
|
|
||||||
|
NotifyBanner { id: notify }
|
||||||
|
|
||||||
initialPage: Component { MainView { } }
|
initialPage: Component { MainView { } }
|
||||||
cover: Qt.resolvedUrl("cover/CoverPage.qml")
|
cover: Qt.resolvedUrl("cover/CoverPage.qml")
|
||||||
}
|
}
|
||||||
|
|
1008
qml/lib/gibberish-aes.js
Normal file
1008
qml/lib/gibberish-aes.js
Normal file
File diff suppressed because it is too large
Load diff
|
@ -38,9 +38,8 @@ function getDB() {
|
||||||
// Initialize an empty DB, Create the Table
|
// Initialize an empty DB, Create the Table
|
||||||
db.changeVersion("", "2",
|
db.changeVersion("", "2",
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql("CREATE TABLE IF NOT EXISTS OTPStorage(title TEXT, secret TEXT, type TEXT, counter INTEGER, fav INTEGER);");
|
tx.executeSql("CREATE TABLE IF NOT EXISTS OTPStorage(title TEXT, secret TEXT, type TEXT DEFAULT 'TOPT', counter INTEGER DEFAULT 0, fav INTEGER DEFAULT 0);");
|
||||||
}
|
});
|
||||||
);
|
|
||||||
} else if (db.version == "1.0") {
|
} else if (db.version == "1.0") {
|
||||||
// Upgrade DB Schema to Version 2
|
// Upgrade DB Schema to Version 2
|
||||||
db.changeVersion("1.0", "2",
|
db.changeVersion("1.0", "2",
|
||||||
|
@ -48,8 +47,7 @@ function getDB() {
|
||||||
tx.executeSql("ALTER TABLE OTPStorage ADD COLUMN type TEXT DEFAULT 'TOTP';");
|
tx.executeSql("ALTER TABLE OTPStorage ADD COLUMN type TEXT DEFAULT 'TOTP';");
|
||||||
tx.executeSql("ALTER TABLE OTPStorage ADD COLUMN counter INTEGER DEFAULT 0;");
|
tx.executeSql("ALTER TABLE OTPStorage ADD COLUMN counter INTEGER DEFAULT 0;");
|
||||||
tx.executeSql("ALTER TABLE OTPStorage ADD COLUMN fav INTEGER DEFAULT 0;");
|
tx.executeSql("ALTER TABLE OTPStorage ADD COLUMN fav INTEGER DEFAULT 0;");
|
||||||
}
|
});
|
||||||
);
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// DB Failed to open
|
// DB Failed to open
|
||||||
|
@ -70,8 +68,59 @@ function getOTP() {
|
||||||
mainPage.appendOTP(res.rows.item(i).title, res.rows.item(i).secret, res.rows.item(i).type, res.rows.item(i).counter, res.rows.item(i).fav);
|
mainPage.appendOTP(res.rows.item(i).title, res.rows.item(i).secret, res.rows.item(i).type, res.rows.item(i).counter, res.rows.item(i).fav);
|
||||||
if (res.rows.item(i).fav) mainPage.setCoverOTP(res.rows.item(i).title, res.rows.item(i).secret, res.rows.item(i).type);
|
if (res.rows.item(i).fav) mainPage.setCoverOTP(res.rows.item(i).title, res.rows.item(i).secret, res.rows.item(i).type);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all OTP Values and put them into a JSON-Object
|
||||||
|
function db2json() {
|
||||||
|
var db = getDB();
|
||||||
|
var otpList = [];
|
||||||
|
|
||||||
|
db.transaction(
|
||||||
|
function(tx) {
|
||||||
|
var res = tx.executeSql("select * from OTPStorage;");
|
||||||
|
for (var i=0; i < res.rows.length; i++) {
|
||||||
|
otpList.push({
|
||||||
|
"title": res.rows.item(i).title,
|
||||||
|
"secret": res.rows.item(i).secret,
|
||||||
|
"type": res.rows.item(i).type,
|
||||||
|
"counter": res.rows.item(i).counter,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
)
|
});
|
||||||
|
|
||||||
|
if (otpList.length > 0) {
|
||||||
|
return(JSON.stringify({"app": "sailotp", "version": 1, "otplist": otpList}));
|
||||||
|
} else {
|
||||||
|
return("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read Values from JSON and put them into the DB
|
||||||
|
function json2db(jsonString, error) {
|
||||||
|
var json = JSON.parse(jsonString);
|
||||||
|
error = "";
|
||||||
|
|
||||||
|
if (json.version != "1" && json.app != "sailotp" ) {
|
||||||
|
error = "Unrecognized format, file is not a SailOTP export";
|
||||||
|
return(false);
|
||||||
|
} else {
|
||||||
|
var otpList = [];
|
||||||
|
otpList = json.otplist;
|
||||||
|
if (otpList.length > 0) {
|
||||||
|
while(otpList.length > 0) {
|
||||||
|
var otpItem = otpList.shift();
|
||||||
|
if (otpItem.title != "" & otpItem.secret.length >= 16) {
|
||||||
|
addOTP(otpItem.title, otpItem.secret, otpItem.type, otpItem.counter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parentPage.refreshOTPList();
|
||||||
|
return(true);
|
||||||
|
} else {
|
||||||
|
error = "File contains no Tokens";
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a new OTP
|
// Add a new OTP
|
||||||
|
@ -80,9 +129,26 @@ function addOTP(title, secret, type, counter) {
|
||||||
|
|
||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql("INSERT INTO OTPStorage VALUES(?, ?, ?, ?, ?);", [title, secret, type, counter, 0]);
|
if (checkOTP(title, secret)) {
|
||||||
}
|
console.log("Token " + title + " is already in DB");
|
||||||
)
|
} else {
|
||||||
|
tx.executeSql("INSERT INTO OTPStorage VALUES(?, ?, ?, ?, ?);", [title, secret, type, counter, 0]);
|
||||||
|
console.log("Token " + title + " added.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if an OTP Token already exists in the DB
|
||||||
|
function checkOTP(title, secret) {
|
||||||
|
var db = getDB();
|
||||||
|
var res
|
||||||
|
|
||||||
|
db.transaction(
|
||||||
|
function(tx) {
|
||||||
|
res = tx.executeSql("select title FROM OTPStorage WHERE title=? and secret=?;", [title, secret]);
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.rows.length > 0 ? true : false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove an existing OTP
|
// Remove an existing OTP
|
||||||
|
@ -92,10 +158,10 @@ function removeOTP(title, secret) {
|
||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql("DELETE FROM OTPStorage WHERE title=? and secret=?;", [title, secret]);
|
tx.executeSql("DELETE FROM OTPStorage WHERE title=? and secret=?;", [title, secret]);
|
||||||
}
|
});
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set OTP to favourite
|
||||||
function setFav(title, secret) {
|
function setFav(title, secret) {
|
||||||
var db = getDB();
|
var db = getDB();
|
||||||
|
|
||||||
|
@ -103,18 +169,17 @@ function setFav(title, secret) {
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql("UPDATE OTPStorage set fav = 0");
|
tx.executeSql("UPDATE OTPStorage set fav = 0");
|
||||||
tx.executeSql("UPDATE OTPStorage set fav = 1 WHERE title=? and secret=?;", [title, secret]);
|
tx.executeSql("UPDATE OTPStorage set fav = 1 WHERE title=? and secret=?;", [title, secret]);
|
||||||
}
|
});
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset favourite Flag for OTP
|
||||||
function resetFav(title, secret) {
|
function resetFav(title, secret) {
|
||||||
var db = getDB();
|
var db = getDB();
|
||||||
|
|
||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql("UPDATE OTPStorage set fav = 0");
|
tx.executeSql("UPDATE OTPStorage set fav = 0");
|
||||||
}
|
});
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change an existing OTP
|
// Change an existing OTP
|
||||||
|
@ -123,12 +188,15 @@ function changeOTP(title, secret, type, counter, oldtitle, oldsecret) {
|
||||||
|
|
||||||
db.transaction(
|
db.transaction(
|
||||||
function(tx) {
|
function(tx) {
|
||||||
tx.executeSql("UPDATE OTPStorage SET title=?, secret=?, type=?, counter=? WHERE title=? and secret=?;", [title, secret, type, counter, oldtitle, oldsecret]);
|
if (checkOTP(title, secret)) {
|
||||||
}
|
console.log("Token " + title + " is already in DB");
|
||||||
)
|
} else {
|
||||||
|
tx.executeSql("UPDATE OTPStorage SET title=?, secret=?, type=?, counter=? WHERE title=? and secret=?;", [title, secret, type, counter, oldtitle, oldsecret]);
|
||||||
|
console.log("Token " + title + " modified.");
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Get the counter for a HOTP value, incerment the counter on request
|
// Get the counter for a HOTP value, incerment the counter on request
|
||||||
function getCounter(title, secret, increment) {
|
function getCounter(title, secret, increment) {
|
||||||
var db = getDB();
|
var db = getDB();
|
||||||
|
@ -139,8 +207,7 @@ function getCounter(title, secret, increment) {
|
||||||
function(tx) {
|
function(tx) {
|
||||||
res = tx.executeSql("SELECT counter FROM OTPStorage where title=? and secret=?;", [title, secret]);
|
res = tx.executeSql("SELECT counter FROM OTPStorage where title=? and secret=?;", [title, secret]);
|
||||||
if (increment) tx.executeSql("UPDATE OTPStorage set counter=counter+1 WHERE title=? and secret=?;", [title, secret]);
|
if (increment) tx.executeSql("UPDATE OTPStorage set counter=counter+1 WHERE title=? and secret=?;", [title, secret]);
|
||||||
}
|
});
|
||||||
)
|
|
||||||
|
|
||||||
return res.rows.item(0).counter;
|
return res.rows.item(0).counter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,7 @@ Page {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
y: 320
|
y: 320
|
||||||
font.bold: true
|
font.bold: true
|
||||||
text: "SailOTP 0.4"
|
text: "SailOTP " + Qt.application.version
|
||||||
}
|
}
|
||||||
Text {
|
Text {
|
||||||
id: desc
|
id: desc
|
||||||
|
@ -67,17 +67,21 @@ Page {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.top: copyright.bottom
|
anchors.top: copyright.bottom
|
||||||
anchors.topMargin: 20
|
anchors.topMargin: 20
|
||||||
text: "<a href=\"https://github.com/seiichiro0185/sailotp\">SailOTP on Github</a>"
|
text: "<a href=\"https://www.seiichiro0185.org/gitlab/seiichiro0185/harbour-sailotp.git\">Source Code</a>"
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Qt.openUrlExternally("https://github.com/seiichiro0185/sailotp")
|
Qt.openUrlExternally("https://www.seiichiro0185.org/gitlab/seiichiro0185/harbour-sailotp.git")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text {
|
TextArea {
|
||||||
id: accnowledgement
|
id: acknowledgement
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.top: homepage.bottom
|
anchors.top: homepage.bottom
|
||||||
anchors.topMargin: 20
|
anchors.topMargin: 20
|
||||||
text: "SailOTP uses the SHA-1 Implementation<br />from http://caligatio.github.io/jsSHA/"
|
width: parent.width
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
horizontalAlignment: TextEdit.Center
|
||||||
|
readOnly: true
|
||||||
|
text: "SailOTP uses the following third party libs:\n\nhttp://caligatio.github.io/jsSHA/\nhttps://github.com/mdp/gibberish-aes"
|
||||||
color: "white"
|
color: "white"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
216
qml/pages/ExportPage.qml
Normal file
216
qml/pages/ExportPage.qml
Normal file
|
@ -0,0 +1,216 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013, Stefan Brand <seiichiro@seiichiro0185.org>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer in the documentation and/or other
|
||||||
|
* materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* 3. The names of the contributors may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||||
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import QtQuick 2.0
|
||||||
|
import Sailfish.Silica 1.0
|
||||||
|
import harbour.sailotp.FileIO 1.0 // Import FileIO Class
|
||||||
|
import "../lib/storage.js" as DB // Import the storage library for Config-Access
|
||||||
|
import "../lib/gibberish-aes.js" as Gibberish //Import AES encryption library
|
||||||
|
|
||||||
|
// Define Layout of the Export / Import Page
|
||||||
|
Dialog {
|
||||||
|
id: exportPage
|
||||||
|
|
||||||
|
// We get the Object of the parent page on call to refresh it after adding a new Entry
|
||||||
|
property QtObject parentPage: null
|
||||||
|
property string mode: "import"
|
||||||
|
|
||||||
|
function fillNum(num) {
|
||||||
|
if (num < 10) {
|
||||||
|
return("0"+num);
|
||||||
|
} else {
|
||||||
|
return(num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function creFileName() {
|
||||||
|
var date = new Date();
|
||||||
|
return(XDG_HOME_DIR + "/sailotp_"+date.getFullYear()+fillNum(date.getMonth()+1)+fillNum(date.getDate())+".aes");
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkFileName(file) {
|
||||||
|
if (mode == "export") {
|
||||||
|
if (exportFile.exists(file) && !fileOverwrite.checked) {
|
||||||
|
notify.show("File already exists, choose \"Overwrite existing\" to overwrite it.", 4000);
|
||||||
|
return(false)
|
||||||
|
} else {
|
||||||
|
return(true)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (exportFile.exists(file)) {
|
||||||
|
return(true)
|
||||||
|
} else {
|
||||||
|
notify.show("Given file does not exist!", 4000);
|
||||||
|
return(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FileIO Object for reading / writing files
|
||||||
|
FileIO {
|
||||||
|
id: exportFile
|
||||||
|
source: fileName.text
|
||||||
|
onError: { console.log(msg); }
|
||||||
|
}
|
||||||
|
|
||||||
|
SilicaFlickable {
|
||||||
|
id: exportFlickable
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
VerticalScrollDecorator {}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
anchors.fill: parent
|
||||||
|
DialogHeader {
|
||||||
|
acceptText: mode == "export" ? "Export" : "Import"
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: fileName
|
||||||
|
width: parent.width
|
||||||
|
text: mode == "export" ? creFileName() : XDG_HOME_DIR + "/";
|
||||||
|
label: "Filename"
|
||||||
|
placeholderText: mode == "import" ? "File to import" : "File to export"
|
||||||
|
focus: true
|
||||||
|
horizontalAlignment: TextInput.AlignLeft
|
||||||
|
}
|
||||||
|
|
||||||
|
TextSwitch {
|
||||||
|
id: fileOverwrite
|
||||||
|
checked: false
|
||||||
|
visible: mode == "export"
|
||||||
|
text: "Overwrite existing"
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: filePassword
|
||||||
|
width: parent.width
|
||||||
|
label: "Password"
|
||||||
|
placeholderText: "Password for the file"
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
focus: true
|
||||||
|
horizontalAlignment: TextInput.AlignLeft
|
||||||
|
}
|
||||||
|
|
||||||
|
TextField {
|
||||||
|
id: filePasswordCheck
|
||||||
|
width: parent.width
|
||||||
|
label: (filePassword.text != filePasswordCheck.text && filePassword.text.length > 0) ? "Passwords don't match!" : "Passwords match!"
|
||||||
|
placeholderText: "Repeated Password for the file"
|
||||||
|
visible: mode == "export"
|
||||||
|
echoMode: TextInput.Password
|
||||||
|
focus: true
|
||||||
|
horizontalAlignment: TextInput.AlignLeft
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: importText
|
||||||
|
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.bottomMargin: 20
|
||||||
|
width: parent.width - 2*Theme.paddingLarge
|
||||||
|
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
maximumLineCount: 15
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.secondaryColor
|
||||||
|
|
||||||
|
visible: mode == "import"
|
||||||
|
text: "Here you can Import Tokens from a file. Put in the file location and the password you used on export. Pull left to start the import."
|
||||||
|
}
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: exportText
|
||||||
|
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.bottomMargin: 20
|
||||||
|
width: parent.width - 2*Theme.paddingLarge
|
||||||
|
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
maximumLineCount: 15
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.secondaryColor
|
||||||
|
|
||||||
|
visible: mode == "export"
|
||||||
|
text: "Here you can export Tokens to a file. The exported file will be encrypted with AES-256-CBC and Base64 encoded. Choose a strong password, the file will contain the secrets used to generate the Tokens for your accounts. Pull left to start the export."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we can continue
|
||||||
|
canAccept: fileName.text.length > 0 && filePassword.text.length > 0 && (mode == "import" || filePassword.text == filePasswordCheck.text) && checkFileName(fileName.text) ? true : false
|
||||||
|
|
||||||
|
// Do the DB-Export / Import
|
||||||
|
onDone: {
|
||||||
|
if (result == DialogResult.Accepted) {
|
||||||
|
var plainText = ""
|
||||||
|
var chipherText = ""
|
||||||
|
|
||||||
|
if (mode == "export") {
|
||||||
|
// Export Database to File
|
||||||
|
plainText = DB.db2json();
|
||||||
|
|
||||||
|
if (plainText != "") {
|
||||||
|
try {
|
||||||
|
chipherText = Gibberish.AES.enc(plainText, filePassword.text);
|
||||||
|
if (!exportFile.write(chipherText)) {
|
||||||
|
notify.show("Error writing to file "+ fileName.text, 4000);
|
||||||
|
} else {
|
||||||
|
notify.show("Token Database exported to "+ fileName.text, 4000);
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
notify.show("Could not encrypt tokens. Error: ", 4000);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notify.show("Could not read tokens from Database", 4000);
|
||||||
|
}
|
||||||
|
} else if(mode == "import") {
|
||||||
|
// Import Tokens from File
|
||||||
|
|
||||||
|
chipherText = exportFile.read();
|
||||||
|
if (chipherText != "") {
|
||||||
|
try {
|
||||||
|
var errormsg = ""
|
||||||
|
plainText = Gibberish.AES.dec(chipherText, filePassword.text);
|
||||||
|
if (DB.json2db(plainText, errormsg)) {
|
||||||
|
notify.show("Tokens imported from "+ fileName.text, 4000);
|
||||||
|
} else {
|
||||||
|
notify.show(errormsg, 4000);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
notify.show("Unable to decrypt file, did you use the right password?", 4000);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notify.show("Could not read from file " + fileName.text, 4000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,7 +40,7 @@ Page {
|
||||||
id: otpListModel
|
id: otpListModel
|
||||||
}
|
}
|
||||||
|
|
||||||
// This holds the time of the last update of the page as Unix Timestamp (in Milliseconds)
|
// This holds the time of the last update of the page as Unix Timestamp (in Milliseconds)
|
||||||
property double lastUpdated: 0
|
property double lastUpdated: 0
|
||||||
|
|
||||||
// Add an entry to the list
|
// Add an entry to the list
|
||||||
|
@ -71,11 +71,11 @@ Page {
|
||||||
|
|
||||||
// Calculate new OTPs for every entry
|
// Calculate new OTPs for every entry
|
||||||
function refreshOTPValues() {
|
function refreshOTPValues() {
|
||||||
// get seconds from current Date
|
// get seconds from current Date
|
||||||
var curDate = new Date();
|
var curDate = new Date();
|
||||||
var seconds = curDate.getSeconds();
|
var seconds = curDate.getSeconds();
|
||||||
|
|
||||||
// Iterate over all List entries
|
// Iterate over all List entries
|
||||||
for (var i=0; i<otpListModel.count; i++) {
|
for (var i=0; i<otpListModel.count; i++) {
|
||||||
if (otpListModel.get(i).type == "TOTP") {
|
if (otpListModel.get(i).type == "TOTP") {
|
||||||
// Only update on full 30 / 60 Seconds or if last run of the Functions is more than 2s in the past (e.g. app was in background)
|
// Only update on full 30 / 60 Seconds or if last run of the Functions is more than 2s in the past (e.g. app was in background)
|
||||||
|
@ -89,9 +89,9 @@ Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the Progressbar
|
// Update the Progressbar
|
||||||
updateProgress.value = 29 - (seconds % 30)
|
updateProgress.value = 29 - (seconds % 30)
|
||||||
// Set lastUpdate property
|
// Set lastUpdate property
|
||||||
lastUpdated = curDate.getTime();
|
lastUpdated = curDate.getTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +112,15 @@ Page {
|
||||||
onClicked: pageStack.push(Qt.resolvedUrl("About.qml"))
|
onClicked: pageStack.push(Qt.resolvedUrl("About.qml"))
|
||||||
}
|
}
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: "Add OTP"
|
text: "Export Token-DB"
|
||||||
|
onClicked: pageStack.push(Qt.resolvedUrl("ExportPage.qml"), {parentPage: mainPage, mode: "export"})
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
text: "Import Token-DB"
|
||||||
|
onClicked: pageStack.push(Qt.resolvedUrl("ExportPage.qml"), {parentPage: mainPage, mode: "import"})
|
||||||
|
}
|
||||||
|
MenuItem {
|
||||||
|
text: "Add Token"
|
||||||
onClicked: pageStack.push(Qt.resolvedUrl("AddOTP.qml"), {parentPage: mainPage})
|
onClicked: pageStack.push(Qt.resolvedUrl("AddOTP.qml"), {parentPage: mainPage})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -155,6 +163,7 @@ Page {
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
Clipboard.text = otp
|
Clipboard.text = otp
|
||||||
|
notify.show("Token for " + title + " copied to clipboard", 3000);
|
||||||
}
|
}
|
||||||
|
|
||||||
ListView.onRemove: animateRemoval()
|
ListView.onRemove: animateRemoval()
|
||||||
|
@ -237,8 +246,9 @@ Page {
|
||||||
VerticalScrollDecorator{}
|
VerticalScrollDecorator{}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
// Load list of OTP-Entries
|
// Load list of OTP-Entries
|
||||||
refreshOTPList();
|
refreshOTPList();
|
||||||
|
console.log("SailOTP Version " + Qt.application.version + " started");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
#
|
|
||||||
# Do NOT Edit the Auto-generated Part!
|
|
||||||
# Generated by: spectacle version 0.27
|
|
||||||
#
|
|
||||||
|
|
||||||
Name: harbour-sailotp
|
|
||||||
|
|
||||||
# >> macros
|
|
||||||
# << macros
|
|
||||||
|
|
||||||
%{!?qtc_qmake:%define qtc_qmake %qmake}
|
|
||||||
%{!?qtc_qmake5:%define qtc_qmake5 %qmake5}
|
|
||||||
%{!?qtc_make:%define qtc_make make}
|
|
||||||
%{?qtc_builddir:%define _builddir %qtc_builddir}
|
|
||||||
Summary: SailOTP
|
|
||||||
Version: 0.2
|
|
||||||
Release: 1
|
|
||||||
Group: Security
|
|
||||||
License: BSD
|
|
||||||
URL: https://github.com/seiichiro0185/sailotp/
|
|
||||||
Source0: %{name}-%{version}.tar.bz2
|
|
||||||
Source100: harbour-sailotp.yaml
|
|
||||||
Requires: sailfishsilica-qt5 >= 0.10.9
|
|
||||||
BuildRequires: pkgconfig(sailfishapp) >= 0.0.10
|
|
||||||
BuildRequires: pkgconfig(Qt5Core)
|
|
||||||
BuildRequires: pkgconfig(Qt5Qml)
|
|
||||||
BuildRequires: pkgconfig(Qt5Quick)
|
|
||||||
BuildRequires: desktop-file-utils
|
|
||||||
|
|
||||||
%description
|
|
||||||
A Sailfish implementation of the Timebased One Time Pad algorithm as used by Google Authenticator and a growing number of Websites.
|
|
||||||
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup -q -n %{name}-%{version}
|
|
||||||
|
|
||||||
# >> setup
|
|
||||||
# << setup
|
|
||||||
|
|
||||||
%build
|
|
||||||
# >> build pre
|
|
||||||
# << build pre
|
|
||||||
|
|
||||||
%qtc_qmake5
|
|
||||||
|
|
||||||
%qtc_make %{?_smp_mflags}
|
|
||||||
|
|
||||||
# >> build post
|
|
||||||
# << build post
|
|
||||||
|
|
||||||
%install
|
|
||||||
rm -rf %{buildroot}
|
|
||||||
# >> install pre
|
|
||||||
# << install pre
|
|
||||||
%qmake5_install
|
|
||||||
|
|
||||||
# >> install post
|
|
||||||
# << install post
|
|
||||||
|
|
||||||
desktop-file-install --delete-original \
|
|
||||||
--dir %{buildroot}%{_datadir}/applications \
|
|
||||||
%{buildroot}%{_datadir}/applications/*.desktop
|
|
||||||
|
|
||||||
%files
|
|
||||||
%defattr(-,root,root,-)
|
|
||||||
/usr/share/icons/hicolor/86x86/apps
|
|
||||||
/usr/share/applications
|
|
||||||
/usr/share/harbour-sailotp
|
|
||||||
/usr/bin
|
|
||||||
%{_datadir}/icons/hicolor/86x86/apps/%{name}.png
|
|
||||||
%{_datadir}/applications/%{name}.desktop
|
|
||||||
%{_datadir}/%{name}/qml
|
|
||||||
%{_bindir}
|
|
||||||
# >> files
|
|
||||||
# << files
|
|
|
@ -1,7 +1,7 @@
|
||||||
Name: harbour-sailotp
|
Name: harbour-sailotp
|
||||||
Summary: SailOTP
|
Summary: SailOTP
|
||||||
Version: 0.4
|
Version: 0.5
|
||||||
Release: 2
|
Release: 1
|
||||||
Group: Security
|
Group: Security
|
||||||
URL: https://github.com/seiichiro0185/sailotp/
|
URL: https://github.com/seiichiro0185/sailotp/
|
||||||
License: "BSD\t"
|
License: "BSD\t"
|
||||||
|
@ -11,20 +11,23 @@ Description: |
|
||||||
A Sailfish implementation of the One Time Pad algorithm as used by Google Authenticator and a growing number of Websites.
|
A Sailfish implementation of the One Time Pad algorithm as used by Google Authenticator and a growing number of Websites.
|
||||||
Configure: none
|
Configure: none
|
||||||
Builder: qtc5
|
Builder: qtc5
|
||||||
|
QMakeOptions:
|
||||||
|
- VERSION=%{version}
|
||||||
|
- RELEASE=%{release}
|
||||||
PkgConfigBR:
|
PkgConfigBR:
|
||||||
- sailfishapp >= 0.0.10
|
|
||||||
- Qt5Core
|
|
||||||
- Qt5Qml
|
|
||||||
- Qt5Quick
|
- Qt5Quick
|
||||||
|
- Qt5Qml
|
||||||
|
- Qt5Core
|
||||||
|
- sailfishapp >= 0.0.10
|
||||||
Requires:
|
Requires:
|
||||||
- sailfishsilica-qt5 >= 0.10.9
|
- sailfishsilica-qt5 >= 0.10.9
|
||||||
Files:
|
Files:
|
||||||
- /usr/share/icons/hicolor/86x86/apps
|
|
||||||
- /usr/share/applications
|
|
||||||
- /usr/share/harbour-sailotp
|
|
||||||
- /usr/bin
|
|
||||||
- '%{_datadir}/icons/hicolor/86x86/apps/%{name}.png'
|
|
||||||
- '%{_datadir}/applications/%{name}.desktop'
|
|
||||||
- '%{_datadir}/%{name}/qml'
|
|
||||||
- '%{_bindir}'
|
- '%{_bindir}'
|
||||||
|
- '%{_datadir}/%{name}/qml'
|
||||||
|
- '%{_datadir}/applications/%{name}.desktop'
|
||||||
|
- '%{_datadir}/icons/hicolor/86x86/apps/%{name}.png'
|
||||||
|
- /usr/bin
|
||||||
|
- /usr/share/harbour-sailotp
|
||||||
|
- /usr/share/applications
|
||||||
|
- /usr/share/icons/hicolor/86x86/apps
|
||||||
PkgBR: []
|
PkgBR: []
|
||||||
|
|
73
src/fileio.cpp
Normal file
73
src/fileio.cpp
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
#include "fileio.h"
|
||||||
|
#include <QFile>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
FileIO::FileIO(QObject *parent) :
|
||||||
|
QObject(parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QString FileIO::read()
|
||||||
|
{
|
||||||
|
if (mSource.isEmpty()){
|
||||||
|
emit error("source is empty");
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile file(mSource);
|
||||||
|
QString fileContent;
|
||||||
|
if ( file.open(QIODevice::ReadOnly) ) {
|
||||||
|
QString line;
|
||||||
|
QTextStream t( &file );
|
||||||
|
do {
|
||||||
|
line = t.readLine();
|
||||||
|
fileContent += line;
|
||||||
|
} while (!line.isNull());
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
} else {
|
||||||
|
emit error("Unable to open the file");
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
return fileContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileIO::write(const QString& data)
|
||||||
|
{
|
||||||
|
if (mSource.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QFile file(mSource);
|
||||||
|
if (!file.open(QFile::WriteOnly | QFile::Truncate))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QTextStream out(&file);
|
||||||
|
out << data;
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileIO::exists()
|
||||||
|
{
|
||||||
|
if (mSource.isEmpty()) {
|
||||||
|
emit error("Source is empty!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile file(mSource);
|
||||||
|
return file.exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileIO::exists(const QString& filename)
|
||||||
|
{
|
||||||
|
if (filename.isEmpty()) {
|
||||||
|
emit error("Source is empty!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile file(filename);
|
||||||
|
return file.exists();
|
||||||
|
}
|
35
src/fileio.h
Normal file
35
src/fileio.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
#ifndef FILEIO_H
|
||||||
|
#define FILEIO_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class FileIO : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
Q_PROPERTY(QString source
|
||||||
|
READ source
|
||||||
|
WRITE setSource
|
||||||
|
NOTIFY sourceChanged)
|
||||||
|
explicit FileIO(QObject *parent = 0);
|
||||||
|
|
||||||
|
Q_INVOKABLE QString read();
|
||||||
|
Q_INVOKABLE bool write(const QString& data);
|
||||||
|
Q_INVOKABLE bool exists();
|
||||||
|
Q_INVOKABLE bool exists(const QString& filename);
|
||||||
|
|
||||||
|
QString source() { return mSource; };
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setSource(const QString& source) { mSource = source; };
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void sourceChanged(const QString& source);
|
||||||
|
void error(const QString& msg);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString mSource;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FILEIO_H
|
|
@ -27,14 +27,28 @@
|
||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef QT_QML_DEBUG
|
|
||||||
#include <QtQuick>
|
#include <QtQuick>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <sailfishapp.h>
|
#include <sailfishapp.h>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include "fileio.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
return SailfishApp::main(argc, argv);
|
QScopedPointer<QGuiApplication> app(SailfishApp::application(argc, argv));
|
||||||
|
QScopedPointer<QQuickView> view(SailfishApp::createView());
|
||||||
|
|
||||||
|
app->setOrganizationName("harbour-sailotp");
|
||||||
|
app->setOrganizationDomain("harbour-sailotp");
|
||||||
|
app->setApplicationName("harbour-sailotp");
|
||||||
|
app->setApplicationVersion(APP_VERSION);
|
||||||
|
|
||||||
|
qmlRegisterType<FileIO, 1>("harbour.sailotp.FileIO", 1, 0, "FileIO");
|
||||||
|
|
||||||
|
view->setSource(SailfishApp::pathTo("qml/harbour-sailotp.qml"));
|
||||||
|
view->rootContext()->setContextProperty("XDG_HOME_DIR", QStandardPaths::writableLocation(QStandardPaths::HomeLocation));
|
||||||
|
view->show();
|
||||||
|
|
||||||
|
|
||||||
|
return app->exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue