2 Commits
7bae84d126
...
5b8a1b126b
| Author | SHA1 | Message | Date |
|---|---|---|---|
|
|
5b8a1b126b |
Checkpoint sekrits code
Sekrits is a small library to store/load secrets from plain text files, a pretty useful tool for building something that needs to communicate securely with something else. |
5 years ago |
|
|
e071294adf |
Add build scripts
Definitely need better documentation, but I'm just trying to checkpoint everything right now. |
5 years ago |
9 changed files with 258 additions and 2 deletions
-
1Makefile.am
-
21README.md
-
32configure.ac
-
6src/Makefile.am
-
3src/main.c
-
92src/sekrits.c
-
30src/sekrits.h
-
7tests/Makefile.am
-
68tests/check_sekrits.c
@ -0,0 +1 @@ |
|||
SUBDIRS = src . tests |
|||
@ -1,5 +1,22 @@ |
|||
Where the F are my trains? |
|||
|
|||
A webapp to quickly look up what trains are doing stuff! |
|||
A webapp to quickly look up where your trains are! |
|||
|
|||
* |
|||
* [ ] Be able to serve web pages |
|||
* [ ] Design the web pages |
|||
* [ ] Be able to query the MTA for Data |
|||
* [ ] Be able to make requests to the site |
|||
* [ ] Be able to authenticate requests |
|||
* [ ] Be able to store/load secrets |
|||
* [ ] Be able to parse GTFS feeds |
|||
* [ ] Build system |
|||
|
|||
# Building |
|||
|
|||
To build the project, use autotools. |
|||
|
|||
```sh |
|||
autoreconf && ./configure && make |
|||
``` |
|||
|
|||
To run unit tests, run `make check` |
|||
@ -0,0 +1,32 @@ |
|||
# -*- Autoconf -*- |
|||
# Process this file with autoconf to produce a configure script. |
|||
|
|||
AC_PREREQ([2.71]) |
|||
AC_INIT([wtftrains],[0.0.1],[sc-bugs@shanti.im]) |
|||
AC_CONFIG_SRCDIR([src/sekrits.c]) |
|||
AC_CONFIG_HEADERS([config.h]) |
|||
#AC_CONFIG_MACRO_DIRS([m4]) |
|||
|
|||
AM_PROG_AR |
|||
|
|||
AM_INIT_AUTOMAKE([foreign -Wall -Werror]) |
|||
|
|||
# Checks for programs. |
|||
|
|||
# Checks for libraries. |
|||
PKG_CHECK_MODULES([CHECK], [check >= 0.9.6]) |
|||
AC_PROG_CC |
|||
LT_INIT |
|||
|
|||
# Checks for header files. |
|||
AC_CHECK_HEADERS([stdlib.h]) |
|||
|
|||
# Checks for typedefs, structures, and compiler characteristics. |
|||
|
|||
# Checks for library functions. |
|||
AC_FUNC_MALLOC |
|||
|
|||
AC_CONFIG_FILES([Makefile |
|||
src/Makefile |
|||
tests/Makefile]) |
|||
AC_OUTPUT |
|||
@ -0,0 +1,6 @@ |
|||
lib_LTLIBRARIES = libwtftrains.la |
|||
libwtftrains_la_SOURCES = sekrits.c sekrits.h arena.h arena.c |
|||
|
|||
bin_PROGRAMS = wtftrains |
|||
wtftrains_SOURCES = main.c |
|||
wtftrains_LDADD = libwtftrains.la |
|||
@ -0,0 +1,3 @@ |
|||
int main(int argc, const char *argv[]) { |
|||
return 0; |
|||
} |
|||
@ -0,0 +1,92 @@ |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
|
|||
#include "sekrits.h" |
|||
|
|||
/// SEKRITS CODE |
|||
|
|||
struct sekrits_node { |
|||
struct sekrits_node *next; |
|||
char *name; |
|||
char *value; |
|||
}; |
|||
|
|||
struct sekrits { |
|||
struct sekrits_node *root; |
|||
}; |
|||
|
|||
int sekrits_create_from_filename(struct sekrits **ppsekrits, const char *filename) { |
|||
FILE *stream = fopen(filename, "r"); |
|||
if (stream == NULL) { |
|||
perror("couldn't open file"); |
|||
return SEKRITS_ERROR; |
|||
} |
|||
int result = sekrits_create_from_file(ppsekrits, stream); |
|||
fclose(stream); |
|||
return result; |
|||
} |
|||
|
|||
/* used to define how long a sekrit line is allowed to be (this includes the |
|||
* sekrit name and value) */ |
|||
#define SEKRIT_MAX_LINE_LEN 8096 |
|||
|
|||
int sekrits_create_from_file(struct sekrits **ppsekrits, FILE *file) { |
|||
struct sekrits *out = (struct sekrits *)malloc(sizeof(struct sekrits)); |
|||
if (file == NULL) { |
|||
return SEKRITS_ERROR; |
|||
} |
|||
char sekrit_buf[SEKRIT_MAX_LINE_LEN] = {0}; |
|||
char *line_end; |
|||
size_t line_num = 0; |
|||
while ((line_end = fgets(sekrit_buf, SEKRIT_MAX_LINE_LEN, file)) != NULL) { |
|||
++line_num; |
|||
ssize_t total_len = line_end - sekrit_buf; |
|||
char *iter; |
|||
for (iter = sekrit_buf; iter < line_end; ++iter) { |
|||
if (*iter == '\\') { |
|||
++iter; |
|||
continue; |
|||
} else if (*iter == '=') { |
|||
*iter = '\0'; |
|||
++iter; |
|||
break; |
|||
} |
|||
} |
|||
char *name = sekrit_buf; |
|||
size_t name_len = iter - sekrit_buf; |
|||
char *value = iter; |
|||
size_t value_len = line_end - iter; |
|||
// char name_buf[SEKRIT_MAX_LINE_LEN] = {0}; |
|||
// char value_buf[SEKRIT_MAX_LINE_LEN] = {0}; |
|||
// char terminator = 0; |
|||
// int read_bytes = 0; |
|||
// do { |
|||
// int res = sscanf(file, "%[^\\=]%n%[\=]c%s", name_buf, &read_bytes, ); |
|||
// } while (res != 2); |
|||
}; |
|||
*ppsekrits = out; |
|||
return SEKRITS_OK; |
|||
} |
|||
|
|||
int sekrits_destroy(struct sekrits *thing) { |
|||
if (thing != NULL) { |
|||
free(thing); |
|||
} |
|||
return SEKRITS_OK; |
|||
} |
|||
int sekrits_fetch(const struct sekrits *, const char *name, char *buf, size_t len); |
|||
|
|||
const char *sekrits_get(struct sekrits *secrets, const char *name) { |
|||
if (secrets == NULL) { |
|||
return NULL; |
|||
} |
|||
struct sekrits_node *curr = secrets->root; |
|||
while (curr != NULL) { |
|||
if (strcmp(curr->name, name)) { |
|||
return curr->value; |
|||
} |
|||
curr = curr->next; |
|||
}; |
|||
return NULL; |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
#ifndef WTFTRAINS_SEKRITS_H |
|||
#define WTFTRAINS_SEKRITS_H |
|||
|
|||
/** |
|||
* Library for loading/storing secrets encoded as simple NAME=VALUE, |
|||
* newline-delimited pairs in a text file. |
|||
*/ |
|||
|
|||
#define SEKRITS_ERROR -1 |
|||
#define SEKRITS_OK 0 |
|||
|
|||
/* opaque struct for storing sekrit information */ |
|||
struct sekrits; |
|||
|
|||
/* load a secret store from an opened file handle */ |
|||
int sekrits_create_from_file(struct sekrits **, FILE *file); |
|||
/* load a secret store from a filename */ |
|||
int sekrits_create_from_filename(struct sekrits **, const char *filename); |
|||
/* destroys an object created with sekrits_create_* */ |
|||
int sekrits_destroy(struct sekrits *); |
|||
|
|||
/* lists all of the names */ |
|||
int sekrits_list_names(const struct sekrits *, char ** names, size_t len); |
|||
/* fetches one specific value, given a name */ |
|||
int sekrits_fetch(const struct sekrits *, const char *name, char *buf, size_t len); |
|||
|
|||
/* convenience function to get the value of a sekrit */ |
|||
const char *sekrits_get(struct sekrits *secrets, const char *name); |
|||
|
|||
#endif // WTFTRAINS_SEKRITS_H |
|||
@ -0,0 +1,7 @@ |
|||
|
|||
TESTS = check_sekrits |
|||
|
|||
check_PROGRAMS = check_sekrits |
|||
check_sekrits_SOURCES = check_sekrits.c $(top_builddir)/src/sekrits.h |
|||
check_sekrits_CFLAGS = @CHECK_CFLAGS@ |
|||
check_sekrits_LDADD = $(top_builddir)/src/libwtftrains.la @CHECK_LIBS@ |
|||
@ -0,0 +1,68 @@ |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <check.h> |
|||
|
|||
#include "../src/sekrits.h" |
|||
|
|||
START_TEST(test_create_from_file) { |
|||
const char *cases[] ={ |
|||
"hello=true", |
|||
"OK=FINE\n", |
|||
"notok" |
|||
}; |
|||
for (int i = 0; i < sizeof(cases); ++ i) { |
|||
struct sekrits *secrets = NULL; |
|||
FILE *data = fmemopen((char *)cases[i], strlen(cases[i]) + 1, "r"); |
|||
ck_assert_msg( |
|||
sekrits_create_from_file(&secrets, data) == SEKRITS_OK, |
|||
"Was expecting valid secret data to load from %s", cases[i] |
|||
); |
|||
sekrits_destroy(secrets); |
|||
fclose(data); |
|||
} |
|||
} |
|||
END_TEST |
|||
|
|||
START_TEST(test_create_from_file_neg) { |
|||
const char *cases[] ={ |
|||
"notok" |
|||
}; |
|||
for (int i = 0; i < sizeof(cases); ++ i) { |
|||
printf("running case"); |
|||
struct sekrits *secrets = NULL; |
|||
FILE *data = fmemopen((char *)cases[i], strlen(cases[i]) + 1, "r"); |
|||
ck_assert_msg( |
|||
sekrits_create_from_file(&secrets, data) == SEKRITS_ERROR, |
|||
"Was expecting invalid secret data to load from %s", cases[i] |
|||
); |
|||
sekrits_destroy(secrets); |
|||
fclose(data); |
|||
} |
|||
} |
|||
END_TEST |
|||
|
|||
Suite * sekrits_suite(void) { |
|||
TCase *tc_create_file; |
|||
tc_create_file = tcase_create("create_from_file"); |
|||
tcase_add_test(tc_create_file, test_create_from_file); |
|||
|
|||
TCase *tc_create_file_neg; |
|||
tc_create_file_neg = tcase_create("create_from_file_neg"); |
|||
tcase_add_test(tc_create_file_neg, test_create_from_file_neg); |
|||
|
|||
Suite *s = suite_create("sekrits"); |
|||
suite_add_tcase(s, tc_create_file); |
|||
suite_add_tcase(s, tc_create_file_neg); |
|||
return s; |
|||
} |
|||
|
|||
int main(void) { |
|||
int number_failed; |
|||
SRunner *srunner = srunner_create(sekrits_suite()); |
|||
|
|||
srunner_run_all(srunner, CK_VERBOSE); |
|||
number_failed = srunner_ntests_failed(srunner); |
|||
srunner_free(srunner); |
|||
|
|||
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue