lime
Lime is a C++ library implementing Open Whisper System Signal protocol
lime_localStorage.hpp
Go to the documentation of this file.
1 /*
2  lime_localStorage.hpp
3  @author Johan Pascal
4  @copyright Copyright (C) 2017 Belledonne Communications SARL
5 
6  This program is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #ifndef lime_localStorage_hpp
21 #define lime_localStorage_hpp
22 
23 #include "soci/soci.h"
25 #include <mutex>
26 
27 namespace lime {
28 
34  class Db {
35  public:
37  soci::session sql;
39  std::recursive_mutex m_db_mutex;
40 
41  Db()=delete; // we can't create a new DB holder without DB filename
42 
48  Db(const std::string &filename);
49  ~Db(){sql.close();};
50 
51  void load_LimeUser(const DeviceId &deviceId, long int &Uid, std::string &url, const bool allStatus=false);
52  void delete_LimeUser(const DeviceId &deviceId);
53  void clean_DRSessions();
54  void clean_SPk();
55  bool is_updateRequested(const DeviceId &deviceId);
56  void set_updateTs(const DeviceId &deviceId);
57  void set_peerDeviceStatus(const DeviceId &peerDeviceId, const std::vector<uint8_t> &Ik, lime::PeerDeviceStatus status);
58  void set_peerDeviceStatus(const DeviceId &peerDeviceId, lime::PeerDeviceStatus status);
59  lime::PeerDeviceStatus get_peerDeviceStatus(const std::string &peerDeviceId);
60  lime::PeerDeviceStatus get_peerDeviceStatus(const std::list<std::string> &peerDeviceIds);
61  void delete_peerDevice(const std::string &peerDeviceId);
62  template <typename Curve>
63  long int check_peerDevice(const std::string &peerDeviceId, const DSA<typename Curve::EC, lime::DSAtype::publicKey> &peerIk, const bool updateInvalid=false);
64  template <typename Curve>
65  long int store_peerDevice(const std::string &peerDeviceId, const DSA<typename Curve::EC, lime::DSAtype::publicKey> &peerIk);
66  void start_transaction();
67  void commit_transaction();
68  void rollback_transaction();
69  };
70 
71  /* this templates are instanciated once in the lime_localStorage.cpp file, explicitly tell anyone including this header that there is no need to re-instanciate them */
72 #ifdef EC25519_ENABLED
73  extern template long int Db::check_peerDevice<C255>(const std::string &peerDeviceId, const DSA<C255, lime::DSAtype::publicKey> &Ik, const bool updateInvalid);
74  extern template long int Db::store_peerDevice<C255>(const std::string &peerDeviceId, const DSA<C255, lime::DSAtype::publicKey> &Ik);
75 #endif
76 
77 #ifdef EC448_ENABLED
78  extern template long int Db::check_peerDevice<C448>(const std::string &peerDeviceId, const DSA<C448, lime::DSAtype::publicKey> &Ik, const bool updateInvalid);
79  extern template long int Db::store_peerDevice<C448>(const std::string &peerDeviceId, const DSA<C448, lime::DSAtype::publicKey> &Ik);
80 #endif
81 #ifdef HAVE_BCTBXPQ
82 #ifdef EC25519_ENABLED
83  extern template long int Db::check_peerDevice<C255K512>(const std::string &peerDeviceId, const DSA<C255K512::EC, lime::DSAtype::publicKey> &Ik, const bool updateInvalid);
84  extern template long int Db::store_peerDevice<C255K512>(const std::string &peerDeviceId, const DSA<C255K512::EC, lime::DSAtype::publicKey> &Ik);
85  extern template long int Db::check_peerDevice<C255MLK512>(const std::string &peerDeviceId, const DSA<C255MLK512::EC, lime::DSAtype::publicKey> &Ik, const bool updateInvalid);
86  extern template long int Db::store_peerDevice<C255MLK512>(const std::string &peerDeviceId, const DSA<C255MLK512::EC, lime::DSAtype::publicKey> &Ik);
87 #endif
88 #ifdef EC448_ENABLED
89  extern template long int Db::check_peerDevice<C448MLK1024>(const std::string &peerDeviceId, const DSA<C448MLK1024::EC, lime::DSAtype::publicKey> &Ik, const bool updateInvalid);
90  extern template long int Db::store_peerDevice<C448MLK1024>(const std::string &peerDeviceId, const DSA<C448MLK1024::EC, lime::DSAtype::publicKey> &Ik);
91 #endif
92 #endif // HAVE_BCTBXPQ
93 
94 }
95 
96 #endif /* lime_localStorage_hpp */
lime::PeerDeviceStatus get_peerDeviceStatus(const std::string &peerDeviceId)
get the status of a peer device: unknown, untrusted, trusted, unsafe device's Id matching a local acc...
Definition: lime_localStorage.cpp:481
void delete_LimeUser(const DeviceId &deviceId)
if exists, delete user
Definition: lime_localStorage.cpp:736
void commit_transaction()
commit a transaction on this Db
Definition: lime_localStorage.cpp:763
Db()=delete
long int store_peerDevice(const std::string &peerDeviceId, const DSA< typename Curve::EC, lime::DSAtype::publicKey > &peerIk)
Store peer device information(DeviceId - GRUU -, public Ik, Uid to link it to a user) in local storag...
Definition: lime_localStorage.cpp:704
void load_LimeUser(const DeviceId &deviceId, long int &Uid, std::string &url, const bool allStatus=false)
Check for existence, retrieve Uid for local user based on its userId (GRUU) and curve from table lime...
Definition: lime_localStorage.cpp:273
void delete_peerDevice(const std::string &peerDeviceId)
delete a peerDevice from local storage
Definition: lime_localStorage.cpp:627
bool is_updateRequested(const DeviceId &deviceId)
checks if a device needs to be updated return true if the device exists and updateTs is older than OP...
Definition: lime_localStorage.cpp:594
void clean_DRSessions()
Delete old stale sessions and old stored message key. Apply to all users in localStorage.
Definition: lime_localStorage.cpp:308
void start_transaction()
start a transaction on this Db
Definition: lime_localStorage.cpp:754
PeerDeviceStatus
Definition: lime.hpp:59
~Db()
Definition: lime_localStorage.hpp:49
void set_peerDeviceStatus(const DeviceId &peerDeviceId, const std::vector< uint8_t > &Ik, lime::PeerDeviceStatus status)
set the peer device status flag in local storage: unsafe, trusted or untrusted.
Definition: lime_localStorage.cpp:363
std::recursive_mutex m_db_mutex
mutex on database access
Definition: lime_localStorage.hpp:39
Definition: lime.hpp:171
Definition: lime.cpp:33
void clean_SPk()
Delete old stale SPk. Apply to all users in localStorage.
Definition: lime_localStorage.cpp:323
void rollback_transaction()
rollback a transaction on this Db
Definition: lime_localStorage.cpp:772
Database access class.
Definition: lime_localStorage.hpp:34
long int check_peerDevice(const std::string &peerDeviceId, const DSA< typename Curve::EC, lime::DSAtype::publicKey > &peerIk, const bool updateInvalid=false)
Check peer device information(DeviceId - GRUU -, public Ik, Uid to link it to a user) in local storag...
Definition: lime_localStorage.cpp:644
soci::session sql
soci connexion to DB
Definition: lime_localStorage.hpp:37
void set_updateTs(const DeviceId &deviceId)
update the update timestamp to now()
Definition: lime_localStorage.cpp:609