Skip to content

Commit d4d6236

Browse files
authored
Merge pull request #1063 from deXol/develop
[BLE] Fix get/setLoginParent/ChildNodeData
2 parents 6d141d1 + 10b6872 commit d4d6236

6 files changed

Lines changed: 70 additions & 30 deletions

File tree

src/Mooltipass/MPNode.cpp

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -334,36 +334,13 @@ QByteArray MPNode::getNodeFlags() const
334334
return data.mid(NODE_FLAG_ADDR_START, ADDRESS_LENGTH);
335335
}
336336

337-
QByteArray MPNode::getLoginNodeData() const
338-
{
339-
// return core data, excluding linked lists and flags
340-
if (!isValid()) return QByteArray();
341-
return data.mid(DATA_ADDR_START);
342-
}
343-
344-
void MPNode::setLoginNodeData(const QByteArray &flags, const QByteArray &d)
345-
{
346-
// overwrite core data, excluding linked lists
347-
if (isValid())
348-
{
349-
data.replace(DATA_ADDR_START, pMesProt->getParentNodeSize()-DATA_ADDR_START, d);
350-
data.replace(0, ADDRESS_LENGTH, flags);
351-
}
352-
}
353-
354-
QByteArray MPNode::getLoginChildNodeData() const
355-
{
356-
// return core data, excluding linked lists and flags
357-
if (!isValid()) return QByteArray();
358-
return data.mid(LOGIN_CHILD_NODE_DATA_ADDR_START);
359-
}
360-
361337
void MPNode::setLoginChildNodeData(const QByteArray &flags, const QByteArray &d)
362338
{
363339
// overwrite core data, excluding linked lists
364340
if (isValid())
365341
{
366-
data.replace(LOGIN_CHILD_NODE_DATA_ADDR_START, pMesProt->getChildNodeSize()-LOGIN_CHILD_NODE_DATA_ADDR_START, d);
342+
const int childNodeDataAddrStart = getLoginChildNodeDataAddrStart();
343+
data.replace(childNodeDataAddrStart, pMesProt->getChildNodeSize()-childNodeDataAddrStart, d);
367344
data.replace(0, ADDRESS_LENGTH, flags);
368345
}
369346
}

src/Mooltipass/MPNode.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,11 @@ class MPNode: public QObject
110110
QByteArray getNodeFlags() const;
111111

112112
// Access node core data
113-
void setLoginNodeData(const QByteArray &flags, const QByteArray &d);
114-
QByteArray getLoginNodeData() const;
113+
virtual void setLoginNodeData(const QByteArray &flags, const QByteArray &d) = 0;
114+
virtual QByteArray getLoginNodeData() const = 0;
115115
void setLoginChildNodeData(const QByteArray &flags, const QByteArray &d);
116-
QByteArray getLoginChildNodeData() const;
116+
virtual QByteArray getLoginChildNodeData() const = 0;
117+
virtual int getLoginChildNodeDataAddrStart() = 0;
117118
void setDataNodeData(const QByteArray &flags, const QByteArray &d);
118119
QByteArray getDataNodeData() const;
119120
void setDataChildNodeData(const QByteArray &flags, const QByteArray &d);
@@ -170,7 +171,6 @@ class MPNode: public QObject
170171

171172
static constexpr int NEXT_DATA_ADDR_START = 2;
172173
static constexpr int DATA_CHILD_DATA_ADDR_START = 4;
173-
static constexpr int LOGIN_CHILD_NODE_DATA_ADDR_START = 6;
174174
static constexpr int DATA_ADDR_START = 8;
175175

176176
static constexpr int SERVICE_ADDR_START = 8;

src/Mooltipass/MPNodeBLE.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,33 @@ bool MPNodeBLE::isValid() const
3535
}
3636

3737
return (data.size() == PARENT_NODE_LENGTH && (NodeParent == type || NodeParentData == type)) ||
38-
(data.size() == CHILD_NODE_LENGTH && (NodeChild == type || NodeChildData == type));
38+
(data.size() == CHILD_NODE_LENGTH && (NodeChild == type || NodeChildData == type));
39+
}
40+
41+
QByteArray MPNodeBLE::getLoginNodeData() const
42+
{
43+
// return core data, excluding linked lists, flags and last child node used address
44+
if (!isValid()) return QByteArray();
45+
return data.mid(DATA_ADDR_START, LAST_CHILD_NODE_USED_ADDR_START - DATA_ADDR_START);
46+
}
47+
48+
void MPNodeBLE::setLoginNodeData(const QByteArray &flags, const QByteArray &d)
49+
{
50+
// overwrite core data, excluding linked lists and last child node used address
51+
if (isValid())
52+
{
53+
const auto parentNodeSize = pMesProt->getParentNodeSize();
54+
const auto bytesAfterLastUsed = parentNodeSize - LAST_CHILD_NODE_USED_ADDR_START;
55+
data.replace(DATA_ADDR_START, parentNodeSize - DATA_ADDR_START - bytesAfterLastUsed, d);
56+
data.replace(0, ADDRESS_LENGTH, flags);
57+
}
58+
}
59+
60+
QByteArray MPNodeBLE::getLoginChildNodeData() const
61+
{
62+
// return core data, excluding linked lists, flags and pointed to child address
63+
if (!isValid()) return QByteArray();
64+
return data.mid(LOGIN_CHILD_NODE_DATA_ADDR_START);
3965
}
4066

4167
QString MPNodeBLE::getService() const

src/Mooltipass/MPNodeBLE.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ class MPNodeBLE : public MPNode
1515
bool isDataLengthValid() const override;
1616
bool isValid() const override;
1717

18+
QByteArray getLoginNodeData() const override;
19+
void setLoginNodeData(const QByteArray &flags, const QByteArray &d) override;
20+
QByteArray getLoginChildNodeData() const override;
21+
int getLoginChildNodeDataAddrStart() override { return LOGIN_CHILD_NODE_DATA_ADDR_START; }
22+
1823
QString getService() const override;
1924
void setService(const QString& service) override;
2025
QByteArray getStartDataCtr() const override;
@@ -74,6 +79,8 @@ class MPNodeBLE : public MPNode
7479
static constexpr int TOTP_CODE_SIZE = 468;
7580
static constexpr int KEY_AFTER_LENGTH = 2;
7681
static constexpr int POINTED_TO_CHILD_START = 6;
82+
static constexpr int LAST_CHILD_NODE_USED_ADDR_START = 260;
83+
static constexpr int LOGIN_CHILD_NODE_DATA_ADDR_START = 8;
7784
static constexpr char BLANK_CHAR = 0x01;
7885
};
7986

src/Mooltipass/MPNodeMini.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,30 @@ bool MPNodeMini::isValid() const
3737
(static_cast<quint8>(data[1]) & 0x20) == 0;
3838
}
3939

40+
QByteArray MPNodeMini::getLoginNodeData() const
41+
{
42+
// return core data, excluding linked lists and flags
43+
if (!isValid()) return QByteArray();
44+
return data.mid(DATA_ADDR_START);
45+
}
46+
47+
void MPNodeMini::setLoginNodeData(const QByteArray &flags, const QByteArray &d)
48+
{
49+
// overwrite core data, excluding linked lists
50+
if (isValid())
51+
{
52+
data.replace(DATA_ADDR_START, pMesProt->getParentNodeSize()-DATA_ADDR_START, d);
53+
data.replace(0, ADDRESS_LENGTH, flags);
54+
}
55+
}
56+
57+
QByteArray MPNodeMini::getLoginChildNodeData() const
58+
{
59+
// return core data, excluding linked lists and flags
60+
if (!isValid()) return QByteArray();
61+
return data.mid(LOGIN_CHILD_NODE_DATA_ADDR_START);
62+
}
63+
4064
QString MPNodeMini::getService() const
4165
{
4266
if (!isValid()) return QString();

src/Mooltipass/MPNodeMini.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ class MPNodeMini : public MPNode
1616
bool isDataLengthValid() const override;
1717
bool isValid() const override;
1818

19+
QByteArray getLoginNodeData() const override;
20+
void setLoginNodeData(const QByteArray &flags, const QByteArray &d) override;
21+
QByteArray getLoginChildNodeData() const override;
22+
int getLoginChildNodeDataAddrStart() override { return LOGIN_CHILD_NODE_DATA_ADDR_START; }
23+
1924
QString getService() const override;
2025
void setService(const QString& service) override;
2126
QByteArray getStartDataCtr() const override;
@@ -39,6 +44,7 @@ class MPNodeMini : public MPNode
3944
static constexpr int PWD_ENC_LENGTH = 32;
4045
static constexpr int DATE_CREATED_ADDR_START = 30;
4146
static constexpr int DATE_LASTUSED_ADDR_START = 32;
47+
static constexpr int LOGIN_CHILD_NODE_DATA_ADDR_START = 6;
4248
};
4349

4450
#endif // MPNODEMINI_H

0 commit comments

Comments
 (0)