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) { |
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 } |