src/server/config/keyfile.c

changeset 91
fac51f87def0
parent 88
73b3485e96f1
child 97
09fbefc0e6a9
equal deleted inserted replaced
90:279f343bbf6c 91:fac51f87def0
41 conf->parser.parse = keyfile_parse; 41 conf->parser.parse = keyfile_parse;
42 conf->file = file; 42 conf->file = file;
43 conf->users = NULL; 43 conf->users = NULL;
44 44
45 int r = cfg_parse_basic_file((ConfigParser*)conf, in); 45 int r = cfg_parse_basic_file((ConfigParser*)conf, in);
46 cfg_list_destr(conf->parser.mp, conf->users);
47 if(r != 0) { 46 if(r != 0) {
48 // TODO: free 47 // TODO: free
49 return NULL; 48 return NULL;
50 } 49 }
51 50
56 55
57 void free_keyfile_config(KeyfileConfig *conf) { 56 void free_keyfile_config(KeyfileConfig *conf) {
58 if(conf->users) { 57 if(conf->users) {
59 ucx_list_free(conf->users); 58 ucx_list_free(conf->users);
60 } 59 }
61 ucx_mempool_destroy(conf->parser.mp); 60 ucx_mempool_destroy(conf->parser.mp->pool);
62 free(conf); 61 free(conf);
63 } 62 }
64 63
65 int keyfile_parse(void *p, ConfigLine *begin, ConfigLine *end, sstr_t line) { 64 int keyfile_parse(void *p, ConfigLine *begin, ConfigLine *end, sstr_t line) {
66 KeyfileConfig *conf = p; 65 KeyfileConfig *conf = p;
67 UcxMempool *mp = conf->parser.mp; 66 UcxAllocator *mp = conf->parser.mp;
68 67
69 size_t tkn = 0; 68 size_t tkn = 0;
70 sstr_t *tk = sstrsplit(line, sstrn(";", 1), &tkn); 69 sstr_t *tk = sstrsplit(line, sstrn(";", 1), &tkn);
71 70
72 if(tkn < 2) { 71 if(tkn < 2) {
76 KeyfileEntry *entry = OBJ_NEW(mp, KeyfileEntry); 75 KeyfileEntry *entry = OBJ_NEW(mp, KeyfileEntry);
77 entry->groups = NULL; 76 entry->groups = NULL;
78 entry->numgroups = 0; 77 entry->numgroups = 0;
79 78
80 // get user name 79 // get user name
81 entry->name = sstrdup_mp(mp, tk[0]); 80 entry->name = sstrdup_a(mp, tk[0]);
82 81
83 // get hash 82 // get hash
84 sstr_t hash = sstrtrim(tk[1]); 83 sstr_t hash = sstrtrim(tk[1]);
85 if(hash.length < 4) { 84 if(hash.length < 4) {
86 // to short 85 // to short
103 102
104 if(!sstrcmp(hash_type, sstr("SSHA"))) { 103 if(!sstrcmp(hash_type, sstr("SSHA"))) {
105 entry->hashtype = KEYFILE_SSHA; 104 entry->hashtype = KEYFILE_SSHA;
106 } else { 105 } else {
107 // unkown hash type 106 // unkown hash type
108 fprintf(stderr, "unknown hash type: %s\n", sstrdup(hash_type).ptr); 107 fprintf(stderr, "unknown hash type: %s\n", sstrdup_a(mp, hash_type).ptr);
109 return 1; 108 return 1;
110 } 109 }
111 110
112 entry->hashdata = sstrdup_mp(mp, hash_data); 111 entry->hashdata = sstrdup_a(mp, hash_data);
113 112
114 // get groups 113 // get groups
115 if(tkn == 3) { 114 if(tkn == 3) {
116 sstr_t groups_str = sstrtrim(tk[2]); 115 sstr_t groups_str = sstrtrim(tk[2]);
117 size_t ngroups = 0; 116 size_t ngroups = 0;
118 sstr_t *groups = sstrsplit(groups_str, sstrn(",", 1), &ngroups); 117 sstr_t *groups = sstrsplit(groups_str, sstrn(",", 1), &ngroups);
119 entry->groups = calloc(ngroups, sizeof(sstr_t)); 118 entry->groups = mp->calloc(mp->pool, ngroups, sizeof(sstr_t));
120 entry->numgroups = ngroups; 119 entry->numgroups = ngroups;
121 for(int i=0;i<ngroups;i++) { 120 for(int i=0;i<ngroups;i++) {
122 entry->groups[i] = sstrdup_mp(mp, sstrtrim(groups[i])); 121 entry->groups[i] = sstrdup_a(mp, sstrtrim(groups[i]));
123 free(groups[i].ptr); 122 free(groups[i].ptr);
124 } 123 }
125 free(groups); 124 free(groups);
126 } 125 }
127 126
128 // add user 127 // add user
129 conf->users = ucx_list_append(conf->users, entry); 128 conf->users = ucx_list_append_a(mp, conf->users, entry);
130 129
131 // free tokens 130 // free tokens
132 for(int i=0;i<tkn;i++) { 131 for(int i=0;i<tkn;i++) {
133 free(tk[i].ptr); 132 free(tk[i].ptr);
134 } 133 }

mercurial