diff --git a/MasterPassword/C/types.c b/MasterPassword/C/types.c index b3d621f2..ca1399d2 100644 --- a/MasterPassword/C/types.c +++ b/MasterPassword/C/types.c @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -209,35 +210,46 @@ static int putvar(int c) { } const char *Identicon(const char *userName, const char *masterPassword) { - const char *left[] = { "╔", "╚", "╰", "═" }; - const char *right[] = { "╗", "╝", "╯", "═" }; + const char *leftArm[] = { "╔", "╚", "╰", "═" }; + const char *rightArm[] = { "╗", "╝", "╯", "═" }; const char *body[] = { "█", "░", "▒", "▓", "☺", "☻" }; const char *accessory[] = { "◈", "◎", "◐", "◑", "◒", "◓", "☀", "☁", "☂", "☃", "☄", "★", "☆", "☎", "☏", "⎈", "⌂", "☘", "☢", "☣", "☕", "⌚", "⌛", "⏰", "⚡", "⛄", "⛅", "☔", "♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟", "♨", "♩", "♪", "♫", "⚐", "⚑", "⚔", "⚖", "⚙", "⚠", "⌘", "⏎", "✄", "✆", "✈", "✉", "✌" }; uint8_t identiconSeed[32]; HMAC_SHA256_Buf(masterPassword, strlen(masterPassword), userName, strlen(userName), identiconSeed); + bool useColor = 0; #ifdef COLOR - setupterm(NULL, 2, NULL); - initputvar(); - tputs(tparm(tgetstr("AF", NULL), identiconSeed[4] % 7 + 1), 1, putvar); - char red[strlen(putvarc)]; - strcpy(red, putvarc); - tputs(tgetstr("me", NULL), 1, putvar); - char reset[strlen(putvarc)]; - strcpy(reset, putvarc); -#else - const char *red = "", *reset = ""; + if (isatty(STDERR_FILENO)) + useColor = 1; #endif + uint8_t colorIdentifier = identiconSeed[4] % 7 + 1; + char *colorString, *resetString; + if (useColor) { + setupterm(NULL, STDERR_FILENO, NULL); + initputvar(); + tputs(tparm(tgetstr("AF", NULL), colorIdentifier), 1, putvar); + colorString = calloc(strlen(putvarc), sizeof(char)); + strcpy(colorString, putvarc); + tputs(tgetstr("me", NULL), 1, putvar); + resetString = calloc(strlen(putvarc), sizeof(char)); + strcpy(resetString, putvarc); + } else { + colorString = calloc(1, sizeof(char)); + resetString = calloc(1, sizeof(char)); + } + char *identicon = (char *)calloc(20, sizeof(char)); sprintf(identicon, "%s%s%s%s%s%s", - red, - left[identiconSeed[0] % (sizeof(left) / sizeof(left[0]))], + colorString, + leftArm[identiconSeed[0] % (sizeof(leftArm) / sizeof(leftArm[0]))], body[identiconSeed[1] % (sizeof(body) / sizeof(body[0]))], - right[identiconSeed[2] % (sizeof(right) / sizeof(right[0]))], + rightArm[identiconSeed[2] % (sizeof(rightArm) / sizeof(rightArm[0]))], accessory[identiconSeed[3] % (sizeof(accessory) / sizeof(accessory[0]))], - reset); + resetString); + free(colorString); + free(resetString); return identicon; }