Sun, 17 Dec 2023 14:25:34 +0100
[Makefile] fix missing rules preventing dry-runs
We have to support dry-runs, because many IDEs are using
dry-runs to collect build information.
Some rules have dependencies that expect certain files or
directories to be just present. We added respective build
rules which invoke the test program. This way, the behavior
when running make normally is exactly the same, but dry-runs
are also not failing now.
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
4 | * Copyright 2018 Olaf Wintermann. All rights reserved. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
31 | #include <string.h> |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include "pwd.h" |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
35 | #include <cx/buffer.h> |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
36 | #include <cx/utils.h> |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
37 | #include <cx/hash_map.h> |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
38 | |
608
3e4c0285a868
fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
39 | #ifdef _WIN32 |
3e4c0285a868
fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
40 | #include <winsock.h> |
789
378b5ab86f77
add new build system for windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
747
diff
changeset
|
41 | #pragma comment(lib, "Ws2_32.lib") |
608
3e4c0285a868
fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
42 | #else |
3e4c0285a868
fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
43 | #include <netinet/in.h> |
3e4c0285a868
fix build on windows
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
515
diff
changeset
|
44 | #endif |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | PwdStore* pwdstore_open(const char *file) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | FILE *in = fopen(file, "r"); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | if(!in) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
50 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
52 | CxBuffer *buf = cxBufferCreate(NULL, 2048, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
53 | cx_stream_copy(in, buf, (cx_read_func)fread, (cx_write_func)cxBufferWrite); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | fclose(in); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | if(buf->size < PWDS_HEADER_SIZE || buf->space[0] != PWDS_MAGIC_CHAR) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
57 | cxBufferFree(buf); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | return NULL; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | PwdStore *p = malloc(sizeof(PwdStore)); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
62 | p->ids = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
63 | p->locations = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
64 | p->noloc = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
65 | p->index = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
66 | p->content = buf; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | p->key = NULL; |
731
e0358fa1a3b1
implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
654
diff
changeset
|
68 | p->unlock_cmd = NULL; |
e0358fa1a3b1
implement secretstore unlock command
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
654
diff
changeset
|
69 | p->lock_cmd = NULL; |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
70 | p->encoffset = PWDS_HEADER_SIZE; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | p->isdecrypted = 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
73 | if(pwdstore_getindex(p)) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
74 | pwdstore_free(p); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
75 | return NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
76 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
77 | |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
78 | return p; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
79 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
80 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | PwdStore* pwdstore_new(void) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | PwdStore *p = calloc(1, sizeof(PwdStore)); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
83 | p->ids = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
84 | p->locations = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
85 | p->noloc = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
86 | p->index = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
87 | p->content = cxBufferCreate(NULL, PWDS_HEADER_SIZE, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | PWDS_MAGIC(p) = PWDS_MAGIC_CHAR; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
89 | PWDS_VERSION(p) = 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | PWDS_ENC(p) = DAV_KEY_AES256; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | PWDS_PWFUNC(p) = DAV_PWFUNC_PBKDF2_SHA256; |
488
29b979ca8750
adds dav_pw2key commoncrypto implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
474
diff
changeset
|
92 | dav_rand_bytes((unsigned char*)p->content->space+4, 16); |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
93 | p->isdecrypted = 1; |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
94 | p->encoffset = PWDS_HEADER_SIZE; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | return p; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
98 | static int readval(CxBuffer *in, char **val, int allowzero) { |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
99 | // value = length string |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
100 | // length = uint32 |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
101 | // string = bytes |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
102 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
103 | *val = NULL; |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
104 | |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
105 | // get length |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
106 | uint32_t length = 0; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
107 | if(cxBufferRead(&length, 1, sizeof(uint32_t), in) != sizeof(uint32_t)) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
108 | return 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
109 | } |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
110 | length = ntohl(length); // convert from BE to host byte order |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
111 | if(length == 0) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
112 | if(allowzero) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
113 | return 1; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
114 | } else { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
115 | return 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
116 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
117 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
118 | if(length > PWDSTORE_MAX_LEN) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
119 | return 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
120 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
121 | |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
122 | // get value |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
123 | char *value = malloc(length + 1); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
124 | value[length] = 0; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
125 | if(cxBufferRead(value, 1, length, in) != length) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
126 | free(value); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
127 | return 0; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
128 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
129 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
130 | *val = value; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
131 | return 1; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
132 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
133 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
134 | static int read_indexentry(PwdStore *p, CxBuffer *in) { |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
135 | // read type of index element |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
136 | int type = cxBufferGet(in); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
137 | if(type == EOF || type != 0) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
138 | // only type 0 supported yet |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
139 | return 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
140 | } |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
141 | |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
142 | char *id = NULL; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
143 | CxList *locations = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
144 | locations->simple_destructor = free; |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
145 | |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
146 | // get id (required) |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
147 | int ret = 0; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
148 | if(readval(in, &id, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
149 | ret = 1; |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
150 | // get locations |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
151 | char *location = NULL; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
152 | while((ret = readval(in, &location, TRUE)) == 1) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
153 | if(!location) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
154 | break; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
155 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
156 | cxListAdd(locations, location); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
157 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
158 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
159 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
160 | if(ret) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
161 | pwdstore_put_index(p, id, locations); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
162 | } else { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
163 | if(id) free(id); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
164 | cxListDestroy(locations); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
165 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
166 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
167 | return ret; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
168 | } |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
169 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
170 | static int read_pwdentry(PwdStore *p, CxBuffer *in) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
171 | int type = cxBufferGet(in); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
172 | if(type == EOF || type != 0) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
173 | // only type 0 supported yet |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
174 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
175 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
176 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
177 | char *id = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
178 | char *location = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
179 | char *user = NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
180 | char *password = NULL; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
181 | |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
182 | int ret = 0; |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
183 | if(readval(in, &id, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
184 | if(readval(in, &user, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
185 | if(readval(in, &password, FALSE)) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
186 | pwdstore_put(p, id, user, password); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
187 | ret = 1; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
188 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
189 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
190 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
191 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
192 | if(id) free(id); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
193 | if(location) free(location); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
194 | if(user) free(user); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
195 | if(password) free(password); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
196 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
197 | return ret; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
198 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
199 | |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
200 | static int remove_list_entries(PwdStore *s, const char *id) { |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
201 | int ret = 0; |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
202 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
203 | CxList *loc_entry = NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
204 | CxList *noloc_entry = NULL; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
205 | |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
206 | CxMutIterator i = cxListMutIterator(s->locations); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
207 | cx_foreach(PwdIndexEntry*, ie, i) { |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
208 | if(!strcmp(ie->id, id)) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
209 | cxIteratorFlagRemoval(i); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
210 | // TODO: break loop |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
211 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
212 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
213 | i = cxListMutIterator(s->noloc); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
214 | cx_foreach(PwdIndexEntry*, ie, i) { |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
215 | if(!strcmp(ie->id, id)) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
216 | cxIteratorFlagRemoval(i); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
217 | // TODO: break loop |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
218 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
219 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
220 | |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
221 | return ret; |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
222 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
223 | |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
224 | void pwdstore_remove_entry(PwdStore *s, const char *id) { |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
225 | while(remove_list_entries(s, id)) {} |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
226 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
227 | CxHashKey key = cx_hash_key_str(id); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
228 | PwdIndexEntry *i = cxMapRemoveAndGet(s->index, key); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
229 | PwdEntry *e = cxMapRemoveAndGet(s->ids, key); |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
230 | |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
231 | if(i) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
232 | cxListDestroy(i->locations); |
654
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
233 | free(i->id); |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
234 | free(i); |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
235 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
236 | if(e) { |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
237 | free(e->id); |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
238 | free(e->user); |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
239 | free(e->password); |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
240 | free(e); |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
241 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
242 | } |
8f2b8f2a5cde
add remove-user and list-users commands
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
653
diff
changeset
|
243 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
244 | int pwdstore_getindex(PwdStore *s) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
245 | uint32_t netindexlen; |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
246 | |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
247 | // set the position to the last 4 bytes of the header |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
248 | // for reading index length |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
249 | s->content->pos = PWDS_HEADER_SIZE - sizeof(uint32_t); |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
250 | |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
251 | // read indexlen and convert to host byte order |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
252 | if(cxBufferRead(&netindexlen, 1, sizeof(uint32_t), s->content) != sizeof(uint32_t)) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
253 | return 1; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
254 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
255 | uint32_t indexlen = ntohl(netindexlen); |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
256 | |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
257 | // integer overflow check |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
258 | if(UINT32_MAX - PWDS_HEADER_SIZE < indexlen) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
259 | return 1; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
260 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
261 | if(s->content->size < PWDS_HEADER_SIZE + indexlen) { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
262 | return 1; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
263 | } |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
264 | // encrypted content starts after the index content |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
265 | s->encoffset = PWDS_HEADER_SIZE + indexlen; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
266 | |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
267 | // the index starts after the header |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
268 | CxBuffer *index = cxBufferCreate(s->content->space+PWDS_HEADER_SIZE, indexlen, cxDefaultAllocator, 0); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
269 | index->size = indexlen; |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
270 | |
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
271 | // read index |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
272 | while(read_indexentry(s, index)) {} |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
273 | |
653
f503c272bd70
update secret store format description
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
608
diff
changeset
|
274 | // free index buffer structure (not the content) |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
275 | cxBufferFree(index); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
276 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
277 | return 0; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
278 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
279 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
280 | int pwdstore_decrypt(PwdStore *p) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
281 | if(!p->key) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
282 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
283 | } |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
284 | if(p->isdecrypted) { |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
285 | return 0; |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
286 | } |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
287 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
288 | // decrypt contet |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
289 | size_t encsz = p->content->size - p->encoffset; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
290 | CxBuffer *enc = cxBufferCreate(p->content->space + p->encoffset, encsz, cxDefaultAllocator, 0); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
291 | enc->size = encsz; |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
292 | enc->size = p->content->size - p->encoffset; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
293 | CxBuffer *content = aes_decrypt_buffer(enc, p->key); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
294 | cxBufferFree(enc); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
295 | if(!content) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
296 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
297 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
298 | |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
299 | while(read_pwdentry(p, content)) {} |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
300 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
301 | cxBufferFree(content); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
302 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
303 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
304 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
305 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
306 | int pwdstore_setpassword(PwdStore *p, const char *password) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
307 | DavKey *key = dav_pw2key( |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
308 | password, |
515
2465dd550bb5
fixes signedness of salt in dav_pw2key()
Mike Becker <universe@uap-core.de>
parents:
489
diff
changeset
|
309 | (unsigned char*)(p->content->space + 4), |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
310 | 16, |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
311 | PWDS_PWFUNC(p), |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
312 | PWDS_ENC(p)); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
313 | if(!key) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
314 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
315 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
316 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
317 | p->key = key; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
318 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
319 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
320 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
321 | void pwdstore_encsettings(PwdStore *p, uint8_t enc, uint8_t pwfunc) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
322 | PWDS_ENC(p) = enc; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
323 | PWDS_PWFUNC(p) = pwfunc; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
324 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
325 | |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
326 | void pwdstore_free_entry(PwdEntry *e) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
327 | if(e->id) free(e->id); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
328 | if(e->user) free(e->user); |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
329 | if(e->password) free(e->password); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
330 | free(e); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
331 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
332 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
333 | void pwdstore_free(PwdStore* p) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
334 | p->ids->simple_destructor = (cx_destructor_func)pwdstore_free_entry; |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
335 | cxMapDestroy(p->ids); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
336 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
337 | cxListDestroy(p->locations); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
338 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
339 | if(p->content) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
340 | cxBufferFree(p->content); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
341 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
342 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
343 | free(p); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
344 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
345 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
346 | int pwdstore_has_id(PwdStore *s, const char *id) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
347 | return cxMapGet(s->index, cx_hash_key_str(id)) ? 1 : 0; |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
348 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
349 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
350 | PwdEntry* pwdstore_get(PwdStore *p, const char *id) { |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
351 | PwdEntry *e = cxMapGet(p->ids, cx_hash_key_str(id)); |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
352 | if(e && e->user && e->password) { |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
353 | return e; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
354 | } else { |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
355 | return NULL; |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
356 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
357 | } |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
358 | |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
359 | void pwdstore_put(PwdStore *p, const char *id, const char *username, const char *password) { |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
360 | PwdEntry *entry = malloc(sizeof(PwdEntry)); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
361 | entry->id = strdup(id); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
362 | entry->user = strdup(username); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
363 | entry->password = strdup(password); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
364 | cxMapPut(p->ids, cx_hash_key_str(id), entry); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
365 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
366 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
367 | void pwdstore_put_index(PwdStore *p, char *id, CxList *locations) { |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
368 | PwdIndexEntry *e = cxMapGet(p->index, cx_hash_key_str(id)); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
369 | if(e) { |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
370 | return; |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
371 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
372 | PwdIndexEntry *newentry = malloc(sizeof(PwdIndexEntry)); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
373 | newentry->id = id; |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
374 | if(locations) { |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
375 | newentry->locations = locations; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
376 | cxListAdd(p->locations, newentry); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
377 | } else { |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
378 | newentry->locations = NULL; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
379 | cxListAdd(p->noloc, newentry); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
380 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
381 | cxMapPut(p->index, cx_hash_key_str(id), newentry); |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
382 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
383 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
384 | void write_index_entry(CxBuffer *out, PwdIndexEntry *e) { |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
385 | uint32_t idlen = strlen(e->id); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
386 | uint32_t netidlen = htonl(idlen); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
387 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
388 | cxBufferPut(out, 0); // type |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
389 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
390 | cxBufferWrite(&netidlen, 1, sizeof(uint32_t), out); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
391 | cxBufferWrite(e->id, 1, idlen, out); |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
392 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
393 | CxIterator i = cxListIterator(e->locations); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
394 | cx_foreach(char *, location, i) { |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
395 | uint32_t locationlen = strlen(location); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
396 | uint32_t netlocationlen = htonl(locationlen); |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
397 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
398 | cxBufferWrite(&netlocationlen, 1, sizeof(uint32_t), out); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
399 | cxBufferWrite(location, 1, locationlen, out); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
400 | } |
489
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
401 | |
fb69eae42ef0
credentials can have multiple locations now
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
488
diff
changeset
|
402 | uint32_t terminate = 0; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
403 | cxBufferWrite(&terminate, 1, sizeof(uint32_t), out); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
404 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
405 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
406 | int pwdstore_store(PwdStore *p, const char *file) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
407 | if(!p->key) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
408 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
409 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
410 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
411 | CxBuffer *index = cxBufferCreate(NULL, 2048, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
412 | CxBuffer *content = cxBufferCreate(NULL, 2048, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
413 | |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
414 | // create index |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
415 | CxIterator i = cxListIterator(p->noloc); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
416 | cx_foreach(PwdIndexEntry*, e, i) { |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
417 | write_index_entry(index, e); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
418 | } |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
419 | i = cxListIterator(p->locations); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
420 | cx_foreach(PwdIndexEntry*, e, i) { |
474
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
421 | write_index_entry(index, e); |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
422 | } |
017a4f09e6fa
improves secret store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
473
diff
changeset
|
423 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
424 | i = cxMapIteratorValues(p->ids); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
425 | cx_foreach(PwdEntry*, value, i) { |
473
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
426 | if(!value->id || !value->user || !value->password) { |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
427 | continue; |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
428 | } |
6740adb5fccd
adds support for location credentials
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
472
diff
changeset
|
429 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
430 | uint32_t idlen = strlen(value->id); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
431 | uint32_t ulen = strlen(value->user); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
432 | uint32_t plen = strlen(value->password); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
433 | uint32_t netidlen = htonl(idlen); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
434 | uint32_t netulen = htonl(ulen); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
435 | uint32_t netplen = htonl(plen); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
436 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
437 | // content buffer |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
438 | cxBufferPut(content, 0); // type |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
439 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
440 | cxBufferWrite(&netidlen, 1, sizeof(uint32_t), content); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
441 | cxBufferWrite(value->id, 1, idlen, content); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
442 | cxBufferWrite(&netulen, 1, sizeof(uint32_t), content); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
443 | cxBufferWrite(value->user, 1, ulen, content); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
444 | cxBufferWrite(&netplen, 1, sizeof(uint32_t), content); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
445 | cxBufferWrite(value->password, 1, plen, content); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
446 | } |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
447 | |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
448 | content->pos = 0; |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
449 | CxBuffer *enc = aes_encrypt_buffer(content, p->key); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
450 | |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
451 | p->content->pos = PWDS_HEADER_SIZE - sizeof(uint32_t); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
452 | p->content->size = PWDS_HEADER_SIZE; |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
453 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
454 | // add index after header |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
455 | uint32_t netindexlen = htonl((uint32_t)index->size); |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
456 | cxBufferWrite(&netindexlen, 1, sizeof(uint32_t), p->content); |
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
457 | cxBufferWrite(index->space, 1, index->size, p->content); |
472
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
458 | |
08d2d1263429
new secrets store file format
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
470
diff
changeset
|
459 | // add encrypted buffer |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
460 | cxBufferWrite(enc->space, 1, enc->size, p->content); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
461 | |
747
efbd59642577
ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
731
diff
changeset
|
462 | cxBufferFree(enc); |
470
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
463 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
464 | FILE *out = fopen(file, "w"); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
465 | if(!out) { |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
466 | return 1; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
467 | } |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
468 | fwrite(p->content->space, 1, p->content->size, out); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
469 | fclose(out); |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
470 | |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
471 | return 0; |
6bf798ad3aec
adds encrypted password store
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
472 | } |