• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4881

14 Dec 2025 03:48AM UTC coverage: 60.617% (+0.5%) from 60.092%
#4881

push

travis-ci

web-flow
test: update coverage workflow time (#33918)

156854 of 258761 relevant lines covered (60.62%)

75258957.81 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

52.64
/source/dnode/mgmt/node_util/src/dmFile.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http:www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include "crypt.h"
18
#include "dmUtil.h"
19
#include "tchecksum.h"
20
#include "tgrant.h"
21
#include "tjson.h"
22

23
#define MAXLEN               1024
24
#define DM_KEY_INDICATOR     "this indicator!"
25
#define DM_ENCRYPT_CODE_FILE "encryptCode.cfg"
26
#define DM_CHECK_CODE_FILE   "checkCode.bin"
27

28
static int32_t dmDecodeFile(SJson *pJson, bool *deployed) {
2,204✔
29
  int32_t code = 0;
2,204✔
30
  int32_t value = 0;
2,204✔
31

32
  tjsonGetInt32ValueFromDouble(pJson, "deployed", value, code);
2,204✔
33
  if (code < 0) return code;
2,204✔
34

35
  *deployed = (value != 0);
2,204✔
36
  return code;
2,204✔
37
}
38

39
int32_t dmReadFile(const char *path, const char *name, bool *pDeployed) {
637,870✔
40
  int32_t   code = -1;
637,870✔
41
  TdFilePtr pFile = NULL;
637,870✔
42
  char     *content = NULL;
637,870✔
43
  SJson    *pJson = NULL;
637,870✔
44
  char      file[PATH_MAX] = {0};
637,870✔
45
  int32_t   nBytes = snprintf(file, sizeof(file), "%s%s%s.json", path, TD_DIRSEP, name);
637,870✔
46
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
637,870✔
47
    code = TSDB_CODE_OUT_OF_BUFFER;
×
48
    goto _OVER;
×
49
  }
50

51
  if (taosStatFile(file, NULL, NULL, NULL) < 0) {
637,870✔
52
    dInfo("file:%s not exist", file);
636,016✔
53
    code = 0;
636,016✔
54
    goto _OVER;
636,016✔
55
  }
56

57
  pFile = taosOpenFile(file, TD_FILE_READ);
1,854✔
58
  if (pFile == NULL) {
1,854✔
59
    code = terrno;
×
60
    dError("failed to open file:%s since %s", file, tstrerror(code));
×
61
    goto _OVER;
×
62
  }
63

64
  int64_t size = 0;
1,854✔
65
  code = taosFStatFile(pFile, &size, NULL);
1,854✔
66
  if (code != 0) {
1,854✔
67
    dError("failed to fstat file:%s since %s", file, tstrerror(code));
×
68
    goto _OVER;
×
69
  }
70

71
  content = taosMemoryMalloc(size + 1);
1,854✔
72
  if (content == NULL) {
1,854✔
73
    code = terrno;
×
74
    goto _OVER;
×
75
  }
76

77
  if (taosReadFile(pFile, content, size) != size) {
1,854✔
78
    code = terrno;
×
79
    dError("failed to read file:%s since %s", file, tstrerror(code));
×
80
    goto _OVER;
×
81
  }
82

83
  content[size] = '\0';
1,854✔
84

85
  pJson = tjsonParse(content);
1,854✔
86
  if (pJson == NULL) {
1,854✔
87
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
88
    goto _OVER;
×
89
  }
90

91
  if (dmDecodeFile(pJson, pDeployed) < 0) {
1,854✔
92
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
93
    goto _OVER;
×
94
  }
95

96
  code = 0;
1,854✔
97
  dInfo("succceed to read mnode file %s", file);
1,854✔
98

99
_OVER:
637,604✔
100
  if (content != NULL) taosMemoryFree(content);
637,870✔
101
  if (pJson != NULL) cJSON_Delete(pJson);
637,870✔
102
  if (pFile != NULL) taosCloseFile(&pFile);
637,870✔
103

104
  if (code != 0) {
637,870✔
105
    dError("failed to read dnode file:%s since %s", file, tstrerror(code));
×
106
  }
107
  return code;
637,870✔
108
}
109

110
int32_t dmReadFileJson(const char *path, const char *name, SJson **ppJson, bool* deployed) {
318,935✔
111
  int32_t   code = -1;
318,935✔
112
  TdFilePtr pFile = NULL;
318,935✔
113
  char     *content = NULL;
318,935✔
114
  char      file[PATH_MAX] = {0};
318,935✔
115
  int32_t   nBytes = snprintf(file, sizeof(file), "%s%s%s.json", path, TD_DIRSEP, name);
318,935✔
116
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
318,935✔
117
    code = TSDB_CODE_OUT_OF_BUFFER;
×
118
    goto _OVER;
×
119
  }
120

121
  if (taosStatFile(file, NULL, NULL, NULL) < 0) {
318,935✔
122
    dInfo("file:%s not exist", file);
318,585✔
123
    code = 0;
318,585✔
124
    goto _OVER;
318,585✔
125
  }
126

127
  pFile = taosOpenFile(file, TD_FILE_READ);
350✔
128
  if (pFile == NULL) {
350✔
129
    code = terrno;
×
130
    dError("failed to open file:%s since %s", file, tstrerror(code));
×
131
    goto _OVER;
×
132
  }
133

134
  int64_t size = 0;
350✔
135
  code = taosFStatFile(pFile, &size, NULL);
350✔
136
  if (code != 0) {
350✔
137
    dError("failed to fstat file:%s since %s", file, tstrerror(code));
×
138
    goto _OVER;
×
139
  }
140

141
  content = taosMemoryMalloc(size + 1);
350✔
142
  if (content == NULL) {
350✔
143
    code = terrno;
×
144
    goto _OVER;
×
145
  }
146

147
  if (taosReadFile(pFile, content, size) != size) {
350✔
148
    code = terrno;
×
149
    dError("failed to read file:%s since %s", file, tstrerror(code));
×
150
    goto _OVER;
×
151
  }
152

153
  content[size] = '\0';
350✔
154

155
  *ppJson = tjsonParse(content);
350✔
156
  if (*ppJson == NULL) {
350✔
157
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
158
    goto _OVER;
×
159
  }
160

161
  if (dmDecodeFile(*ppJson, deployed) < 0) {
350✔
162
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
163
    goto _OVER;
×
164
  }
165

166
  code = 0;
350✔
167
  dInfo("succceed to read mnode file %s", file);
350✔
168

169
_OVER:
318,802✔
170
  if (content != NULL) taosMemoryFree(content);
318,935✔
171
  if (pFile != NULL) taosCloseFile(&pFile);
318,935✔
172

173
  if (code != 0) {
318,935✔
174
    if (*ppJson != NULL) cJSON_Delete(*ppJson);
×
175
    dError("failed to read dnode file:%s since %s", file, tstrerror(code));
×
176
  }
177
  return code;
318,935✔
178
}
179

180

181
static int32_t dmEncodeFile(SJson *pJson, bool deployed) {
19,942✔
182
  if (tjsonAddDoubleToObject(pJson, "deployed", deployed) < 0) return TSDB_CODE_INVALID_JSON_FORMAT;
19,942✔
183
  return 0;
19,942✔
184
}
185

186
int32_t dmWriteFile(const char *path, const char *name, bool deployed) {
19,942✔
187
  int32_t   code = -1;
19,942✔
188
  char     *buffer = NULL;
19,942✔
189
  SJson    *pJson = NULL;
19,942✔
190
  TdFilePtr pFile = NULL;
19,942✔
191
  char      file[PATH_MAX] = {0};
19,942✔
192
  char      realfile[PATH_MAX] = {0};
19,942✔
193

194
  int32_t nBytes = snprintf(file, sizeof(file), "%s%s%s.json", path, TD_DIRSEP, name);
19,942✔
195
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
19,942✔
196
    code = TSDB_CODE_OUT_OF_BUFFER;
×
197
    goto _OVER;
×
198
  }
199

200
  nBytes = snprintf(realfile, sizeof(realfile), "%s%s%s.json", path, TD_DIRSEP, name);
19,942✔
201
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
19,942✔
202
    code = TSDB_CODE_OUT_OF_BUFFER;
×
203
    goto _OVER;
×
204
  }
205

206
  pJson = tjsonCreateObject();
19,942✔
207
  if (pJson == NULL) {
19,942✔
208
    code = terrno;
×
209
    goto _OVER;
×
210
  }
211

212
  if ((code = dmEncodeFile(pJson, deployed)) != 0) goto _OVER;
19,942✔
213

214
  buffer = tjsonToString(pJson);
19,942✔
215
  if (buffer == NULL) {
19,942✔
216
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
217
    goto _OVER;
×
218
  }
219

220
  pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH);
19,942✔
221
  if (pFile == NULL) {
19,942✔
222
    code = terrno;
×
223
    goto _OVER;
×
224
  }
225

226
  int32_t len = strlen(buffer);
19,942✔
227
  if (taosWriteFile(pFile, buffer, len) <= 0) {
19,942✔
228
    code = terrno;
×
229
    goto _OVER;
×
230
  }
231
  if (taosFsyncFile(pFile) < 0) {
19,942✔
232
    code = terrno;
×
233
    goto _OVER;
×
234
  }
235

236
  if (taosCloseFile(&pFile) != 0) {
19,942✔
237
    code = TAOS_SYSTEM_ERROR(ERRNO);
×
238
    goto _OVER;
×
239
  }
240
  TAOS_CHECK_GOTO(taosRenameFile(file, realfile), NULL, _OVER);
19,942✔
241

242
  dInfo("succeed to write file:%s", realfile);
19,942✔
243

244
_OVER:
19,942✔
245

246
  if (pJson != NULL) tjsonDelete(pJson);
19,942✔
247
  if (buffer != NULL) taosMemoryFree(buffer);
19,942✔
248
  if (pFile != NULL) taosCloseFile(&pFile);
19,942✔
249

250
  if (code != 0) {
19,942✔
251
    dError("failed to write file:%s since %s", realfile, tstrerror(code));
×
252
  }
253
  return code;
19,942✔
254
}
255

256
int32_t dmWriteFileJson(const char *path, const char *name, SJson *pJson) {
1,573✔
257
  int32_t   code = -1;
1,573✔
258
  char     *buffer = NULL;
1,573✔
259
  TdFilePtr pFile = NULL;
1,573✔
260
  char      file[PATH_MAX] = {0};
1,573✔
261
  char      realfile[PATH_MAX] = {0};
1,573✔
262

263
  int32_t nBytes = snprintf(file, sizeof(file), "%s%s%s.json", path, TD_DIRSEP, name);
1,573✔
264
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
1,573✔
265
    code = TSDB_CODE_OUT_OF_BUFFER;
×
266
    goto _OVER;
×
267
  }
268

269
  nBytes = snprintf(realfile, sizeof(realfile), "%s%s%s.json", path, TD_DIRSEP, name);
1,573✔
270
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
1,573✔
271
    code = TSDB_CODE_OUT_OF_BUFFER;
×
272
    goto _OVER;
×
273
  }
274

275
  buffer = tjsonToString(pJson);
1,573✔
276
  if (buffer == NULL) {
1,573✔
277
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
278
    goto _OVER;
×
279
  }
280

281
  pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH);
1,573✔
282
  if (pFile == NULL) {
1,573✔
283
    code = terrno;
×
284
    goto _OVER;
×
285
  }
286

287
  int32_t len = strlen(buffer);
1,573✔
288
  if (taosWriteFile(pFile, buffer, len) <= 0) {
1,573✔
289
    code = terrno;
×
290
    goto _OVER;
×
291
  }
292
  if (taosFsyncFile(pFile) < 0) {
1,573✔
293
    code = terrno;
×
294
    goto _OVER;
×
295
  }
296

297
  if (taosCloseFile(&pFile) != 0) {
1,573✔
298
    code = TAOS_SYSTEM_ERROR(ERRNO);
×
299
    goto _OVER;
×
300
  }
301
  TAOS_CHECK_GOTO(taosRenameFile(file, realfile), NULL, _OVER);
1,573✔
302

303
  dInfo("succeed to write file:%s", realfile);
1,573✔
304

305
_OVER:
1,573✔
306

307
  if (pJson != NULL) tjsonDelete(pJson);
1,573✔
308
  if (buffer != NULL) taosMemoryFree(buffer);
1,573✔
309
  if (pFile != NULL) taosCloseFile(&pFile);
1,573✔
310

311
  if (code != 0) {
1,573✔
312
    dError("failed to write file:%s since %s", realfile, tstrerror(code));
×
313
  }
314
  return code;
1,573✔
315
}
316

317

318
int32_t dmCheckRunning(const char *dataDir, TdFilePtr *pFile) {
319,500✔
319
  int32_t code = 0;
319,500✔
320
  char    filepath[PATH_MAX] = {0};
319,500✔
321
  snprintf(filepath, sizeof(filepath), "%s%s.running", dataDir, TD_DIRSEP);
319,500✔
322

323
  *pFile = taosOpenFile(filepath, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_CLOEXEC);
319,500✔
324
  if (*pFile == NULL) {
319,500✔
325
    code = terrno;
×
326
    dError("failed to open file:%s since %s", filepath, tstrerror(code));
×
327
    return code;
×
328
  }
329

330
  int32_t retryTimes = 0;
319,500✔
331
  int32_t ret = 0;
319,500✔
332
  do {
333
    ret = taosLockFile(*pFile);
324,870✔
334
    if (ret == 0) break;
324,870✔
335

336
    code = terrno;
5,551✔
337
    taosMsleep(1000);
5,551✔
338
    retryTimes++;
5,551✔
339
    dError("failed to lock file:%s since %s, retryTimes:%d", filepath, tstrerror(code), retryTimes);
5,551✔
340
  } while (retryTimes < 12);
5,551✔
341

342
  if (ret < 0) {
319,500✔
343
    code = TAOS_SYSTEM_ERROR(ERRNO);
181✔
344
    (void)taosCloseFile(pFile);
181✔
345
    *pFile = NULL;
181✔
346
    return code;
181✔
347
  }
348

349
  dDebug("lock file:%s to prevent repeated starts", filepath);
319,319✔
350
  return code;
319,319✔
351
}
352

353
extern int32_t generateEncryptCode(const char *key, const char *machineId, char **encryptCode);
354

355
static int32_t dmWriteCheckCodeFile(char *file, char *realfile, char *key, bool toLogFile) {
2,452✔
356
  TdFilePtr pFile = NULL;
2,452✔
357
  char     *result = NULL;
2,452✔
358
  int32_t   code = -1;
2,452✔
359

360
  int32_t len = ENCRYPTED_LEN(sizeof(DM_KEY_INDICATOR));
2,452✔
361
  result = taosMemoryMalloc(len);
2,452✔
362
  if (result == NULL) {
2,452✔
363
    return terrno;
×
364
  }
365

366
  SCryptOpts opts = {0};
2,452✔
367
  tstrncpy(opts.key, key, ENCRYPT_KEY_LEN + 1);
2,452✔
368
  opts.len = len;
2,452✔
369
  opts.source = DM_KEY_INDICATOR;
2,452✔
370
  opts.result = result;
2,452✔
371
  opts.unitLen = 16;
2,452✔
372
  if (Builtin_CBC_Encrypt(&opts) <= 0) {
2,452✔
373
    code = terrno;
×
374
    encryptError("failed to encrypt checkCode, since %s", tstrerror(code));
×
375
    goto _OVER;
×
376
  }
377

378
  pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH);
2,452✔
379
  if (pFile == NULL) {
2,452✔
380
    code = terrno;
×
381
    goto _OVER;
×
382
  }
383

384
  if (taosWriteFile(pFile, opts.result, len) <= 0) {
2,452✔
385
    code = terrno;
×
386
    goto _OVER;
×
387
  }
388

389
  if (taosFsyncFile(pFile) < 0) {
2,452✔
390
    code = TAOS_SYSTEM_ERROR(ERRNO);
×
391
    goto _OVER;
×
392
  }
393

394
  if (taosCloseFile(&pFile) != 0) {
2,452✔
395
    code = TAOS_SYSTEM_ERROR(ERRNO);
×
396
    goto _OVER;
×
397
  }
398

399
  TAOS_CHECK_GOTO(taosRenameFile(file, realfile), NULL, _OVER);
2,452✔
400

401
  encryptDebug("succeed to write checkCode file:%s", realfile);
2,452✔
402

403
  code = 0;
2,452✔
404
_OVER:
2,452✔
405
  if (pFile != NULL) taosCloseFile(&pFile);
2,452✔
406
  if (result != NULL) taosMemoryFree(result);
2,452✔
407

408
  return code;
2,452✔
409
}
410

411
static int32_t dmWriteEncryptCodeFile(char *file, char *realfile, char *encryptCode, bool toLogFile) {
2,452✔
412
  TdFilePtr pFile = NULL;
2,452✔
413
  int32_t   code = -1;
2,452✔
414

415
  pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH);
2,452✔
416
  if (pFile == NULL) {
2,452✔
417
    code = terrno;
×
418
    goto _OVER;
×
419
  }
420

421
  int32_t len = strlen(encryptCode);
2,452✔
422
  if (taosWriteFile(pFile, encryptCode, len) <= 0) {
2,452✔
423
    code = terrno;
×
424
    goto _OVER;
×
425
  }
426
  if (taosFsyncFile(pFile) < 0) {
2,452✔
427
    code = terrno;
×
428
    goto _OVER;
×
429
  }
430

431
  if (taosCloseFile(&pFile) != 0) {
2,452✔
432
    code = TAOS_SYSTEM_ERROR(ERRNO);
×
433
    goto _OVER;
×
434
  }
435

436
  TAOS_CHECK_GOTO(taosRenameFile(file, realfile), NULL, _OVER);
2,452✔
437

438
  encryptDebug("succeed to write encryptCode file:%s", realfile);
2,452✔
439

440
  code = 0;
2,452✔
441
_OVER:
2,452✔
442
  if (pFile != NULL) taosCloseFile(&pFile);
2,452✔
443

444
  return code;
2,452✔
445
}
446

447
static int32_t dmCompareEncryptKey(char *file, char *key, bool toLogFile) {
×
448
  char     *content = NULL;
×
449
  int64_t   size = 0;
×
450
  TdFilePtr pFile = NULL;
×
451
  char     *result = NULL;
×
452
  int32_t   code = -1;
×
453

454
  pFile = taosOpenFile(file, TD_FILE_READ);
×
455
  if (pFile == NULL) {
×
456
    code = terrno;
×
457
    encryptError("failed to open dnode file:%s since %s", file, tstrerror(code));
×
458
    goto _OVER;
×
459
  }
460

461
  code = taosFStatFile(pFile, &size, NULL);
×
462
  if (code != 0) {
×
463
    encryptError("failed to fstat dnode file:%s since %s", file, tstrerror(code));
×
464
    goto _OVER;
×
465
  }
466

467
  content = taosMemoryMalloc(size);
×
468
  if (content == NULL) {
×
469
    code = terrno;
×
470
    goto _OVER;
×
471
  }
472

473
  if (taosReadFile(pFile, content, size) != size) {
×
474
    code = terrno;
×
475
    encryptError("failed to read dnode file:%s since %s", file, tstrerror(code));
×
476
    goto _OVER;
×
477
  }
478

479
  encryptDebug("succeed to read checkCode file:%s", file);
×
480

481
  int len = ENCRYPTED_LEN(size);
×
482
  result = taosMemoryMalloc(len);
×
483
  if (result == NULL) {
×
484
    code = terrno;
×
485
    encryptError("failed to alloc memory file:%s since %s", file, tstrerror(code));
×
486
    goto _OVER;
×
487
  }
488

489
  SCryptOpts opts = {0};
×
490
  tstrncpy(opts.key, key, ENCRYPT_KEY_LEN + 1);
×
491
  opts.len = len;
×
492
  opts.source = content;
×
493
  opts.result = result;
×
494
  opts.unitLen = 16;
×
495
  if (Builtin_CBC_Decrypt(&opts) <= 0) {
×
496
    code = terrno;
×
497
    encryptError("failed to decrypt checkCode since %s", tstrerror(code));
×
498
    goto _OVER;
×
499
  }
500

501
  if (strcmp(opts.result, DM_KEY_INDICATOR) != 0) {
×
502
    code = TSDB_CODE_DNODE_ENCRYPTKEY_CHANGED;
×
503
    encryptError("failed to compare decrypted result");
×
504
    goto _OVER;
×
505
  }
506

507
  encryptDebug("succeed to compare checkCode file:%s", file);
×
508
  code = 0;
×
509
_OVER:
×
510
  if (result != NULL) taosMemoryFree(result);
×
511
  if (content != NULL) taosMemoryFree(content);
×
512
  if (pFile != NULL) taosCloseFile(&pFile);
×
513

514
  return code;
×
515
}
516

517
int32_t dmUpdateEncryptKey(char *key, bool toLogFile) {
2,452✔
518
#if defined(TD_ENTERPRISE) || defined(TD_ASTRA_TODO)
519
  int32_t code = -1;
2,452✔
520
  int32_t lino = 0;
2,452✔
521
  char   *machineId = NULL;
2,452✔
522
  char   *encryptCode = NULL;
2,452✔
523

524
  char folder[PATH_MAX] = {0};
2,452✔
525

526
  char encryptFile[PATH_MAX] = {0};
2,452✔
527
  char realEncryptFile[PATH_MAX] = {0};
2,452✔
528

529
  char checkFile[PATH_MAX] = {0};
2,452✔
530
  char realCheckFile[PATH_MAX] = {0};
2,452✔
531

532
  int32_t nBytes = snprintf(folder, sizeof(folder), "%s%sdnode", tsDataDir, TD_DIRSEP);
2,452✔
533
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
2,452✔
534
    return TSDB_CODE_OUT_OF_BUFFER;
×
535
  }
536

537
  nBytes = snprintf(encryptFile, sizeof(realEncryptFile), "%s%s%s.bak", folder, TD_DIRSEP, DM_ENCRYPT_CODE_FILE);
2,452✔
538
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
2,452✔
539
    return TSDB_CODE_OUT_OF_BUFFER;
×
540
  }
541

542
  nBytes = snprintf(realEncryptFile, sizeof(realEncryptFile), "%s%s%s", folder, TD_DIRSEP, DM_ENCRYPT_CODE_FILE);
2,452✔
543
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
2,452✔
544
    return TSDB_CODE_OUT_OF_BUFFER;
×
545
  }
546

547
  nBytes = snprintf(checkFile, sizeof(checkFile), "%s%s%s.bak", folder, TD_DIRSEP, DM_CHECK_CODE_FILE);
2,452✔
548
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
2,452✔
549
    return TSDB_CODE_OUT_OF_BUFFER;
×
550
  }
551

552
  snprintf(realCheckFile, sizeof(realCheckFile), "%s%s%s", folder, TD_DIRSEP, DM_CHECK_CODE_FILE);
2,452✔
553
  if (nBytes <= 0 || nBytes >= PATH_MAX) {
2,452✔
554
    return TSDB_CODE_OUT_OF_BUFFER;
×
555
  }
556

557
  if (taosMkDir(folder) != 0) {
2,452✔
558
    code = terrno;
×
559
    encryptError("failed to create dir:%s since %s", folder, tstrerror(code));
×
560
    goto _OVER;
×
561
  }
562

563
  if (taosCheckExistFile(realCheckFile)) {
2,452✔
564
    if ((code = dmCompareEncryptKey(realCheckFile, key, toLogFile)) != 0) {
×
565
      goto _OVER;
×
566
    }
567
  }
568

569
  TAOS_CHECK_GOTO(tGetMachineId(&machineId), &lino, _OVER);
2,452✔
570

571
  TAOS_CHECK_GOTO(generateEncryptCode(key, machineId, &encryptCode), &lino, _OVER);
2,452✔
572

573
  if ((code = dmWriteEncryptCodeFile(encryptFile, realEncryptFile, encryptCode, toLogFile)) != 0) {
2,452✔
574
    goto _OVER;
×
575
  }
576

577
  if ((code = dmWriteCheckCodeFile(checkFile, realCheckFile, key, toLogFile)) != 0) {
2,452✔
578
    goto _OVER;
×
579
  }
580

581
  encryptInfo("Succeed to update encrypt key\n");
2,452✔
582

583
  code = 0;
2,452✔
584
_OVER:
2,452✔
585
  taosMemoryFree(encryptCode);
2,452✔
586
  taosMemoryFree(machineId);
2,452✔
587
  if (code != 0) {
2,452✔
588
    encryptError("failed to update encrypt key at line %d since %s", lino, tstrerror(code));
×
589
  }
590
  TAOS_RETURN(code);
2,452✔
591
#else
592
  return 0;
593
#endif
594
}
595

596
extern int32_t checkAndGetCryptKey(const char *encryptCode, const char *machineId, char **key);
597

598
static int32_t dmReadEncryptCodeFile(char *file, char **output) {
×
599
  TdFilePtr pFile = NULL;
×
600
  int32_t   code = -1;
×
601
  char     *content = NULL;
×
602

603
  pFile = taosOpenFile(file, TD_FILE_READ);
×
604
  if (pFile == NULL) {
×
605
    code = terrno;
×
606
    dError("failed to open dnode file:%s since %s", file, tstrerror(code));
×
607
    goto _OVER;
×
608
  }
609

610
  int64_t size = 0;
×
611
  code = taosFStatFile(pFile, &size, NULL);
×
612
  if (code != 0) {
×
613
    dError("failed to fstat dnode file:%s since %s", file, tstrerror(code));
×
614
    goto _OVER;
×
615
  }
616

617
  content = taosMemoryMalloc(size + 1);
×
618
  if (content == NULL) {
×
619
    code = terrno;
×
620
    goto _OVER;
×
621
  }
622

623
  if (taosReadFile(pFile, content, size) != size) {
×
624
    code = terrno;
×
625
    dError("failed to read dnode file:%s since %s", file, tstrerror(code));
×
626
    goto _OVER;
×
627
  }
628

629
  content[size] = '\0';
×
630

631
  *output = content;
×
632
  content = NULL;
×
633

634
  dInfo("succeed to read encryptCode file:%s", file);
×
635
  code = 0;
×
636
_OVER:
×
637
  if (pFile != NULL) taosCloseFile(&pFile);
×
638
  taosMemoryFree(content);
×
639

640
  return code;
×
641
}
642

643
int32_t dmGetEncryptKey() {
323,392✔
644
#if defined(TD_ENTERPRISE) || defined(TD_ASTRA_TODO)
645
  int32_t code = -1;
323,392✔
646
  char    encryptFile[PATH_MAX] = {0};
323,392✔
647
  char    checkFile[PATH_MAX] = {0};
323,392✔
648
  char   *machineId = NULL;
323,392✔
649
  char   *encryptKey = NULL;
323,392✔
650
  char   *content = NULL;
323,392✔
651

652
  int32_t nBytes = snprintf(encryptFile, sizeof(encryptFile), "%s%sdnode%s%s", tsDataDir, TD_DIRSEP, TD_DIRSEP,
323,392✔
653
                            DM_ENCRYPT_CODE_FILE);
654
  if (nBytes <= 0 || nBytes >= sizeof(encryptFile)) {
323,392✔
655
    code = TSDB_CODE_OUT_OF_BUFFER;
×
656
    return code;
×
657
  }
658

659
  nBytes = snprintf(checkFile, sizeof(checkFile), "%s%sdnode%s%s", tsDataDir, TD_DIRSEP, TD_DIRSEP, DM_CHECK_CODE_FILE);
323,392✔
660
  if (nBytes <= 0 || nBytes >= sizeof(checkFile)) {
323,392✔
661
    code = TSDB_CODE_OUT_OF_BUFFER;
×
662
    return code;
×
663
  }
664

665
  if (!taosCheckExistFile(encryptFile)) {
323,392✔
666
    code = TSDB_CODE_DNODE_INVALID_ENCRYPT_CONFIG;
323,392✔
667
    dInfo("no exist, checkCode file:%s", encryptFile);
323,392✔
668
    return 0;
323,392✔
669
  }
670

671
  if ((code = dmReadEncryptCodeFile(encryptFile, &content)) != 0) {
×
672
    goto _OVER;
×
673
  }
674

675
  if ((code = tGetMachineId(&machineId)) != 0) {
×
676
    goto _OVER;
×
677
  }
678

679
  if ((code = checkAndGetCryptKey(content, machineId, &encryptKey)) != 0) {
×
680
    goto _OVER;
×
681
  }
682

683
  taosMemoryFreeClear(machineId);
×
684
  taosMemoryFreeClear(content);
×
685

686
  if (encryptKey[0] == '\0') {
×
687
    code = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
×
688
    dError("failed to read key since %s", tstrerror(code));
×
689
    goto _OVER;
×
690
  }
691

692
  if ((code = dmCompareEncryptKey(checkFile, encryptKey, true)) != 0) {
×
693
    goto _OVER;
×
694
  }
695

696
  tstrncpy(tsEncryptKey, encryptKey, ENCRYPT_KEY_LEN + 1);
×
697
  taosMemoryFreeClear(encryptKey);
×
698
  tsEncryptionKeyChksum = taosCalcChecksum(0, tsEncryptKey, strlen(tsEncryptKey));
×
699
  tsEncryptionKeyStat = ENCRYPT_KEY_STAT_LOADED;
×
700

701
  code = 0;
×
702
_OVER:
×
703
  if (content != NULL) taosMemoryFree(content);
×
704
  if (encryptKey != NULL) taosMemoryFree(encryptKey);
×
705
  if (machineId != NULL) taosMemoryFree(machineId);
×
706
  if (code != 0) {
×
707
    dError("failed to get encrypt key since %s", tstrerror(code));
×
708
  }
709
  TAOS_RETURN(code);
×
710
#else
711
  return 0;
712
#endif
713
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc