* You might have to enable additional repositories for this. E.g.,
on RHEL, EPEL and RPMFusion (free + nonfree) need to be enabled.
+-- If building vncpasswd with password quality check support:
+ * libpwquality
+
============================
Build Requirements (Windows)
============================
endif()
endif()
+# check for password pwquality check support
+option(ENABLE_PWQUALITY "Enable password pwquality check" ON)
+if(ENABLE_PWQUALITY)
+ if(UNIX)
+ find_package(PkgConfig)
+ if(PKG_CONFIG_FOUND)
+ pkg_check_modules(PWQUALITY pwquality)
+ if(PWQUALITY_FOUND)
+ add_definitions(-DHAVE_PWQUALITY)
+ endif()
+ endif()
+ endif()
+endif()
+
# Generate config.h and make sure the source finds it
configure_file(config.h.in config.h)
add_definitions(-DHAVE_CONFIG_H)
target_include_directories(vncpasswd PUBLIC ${CMAKE_SOURCE_DIR}/common)
target_link_libraries(vncpasswd tx rfb os)
+if(PWQUALITY_FOUND)
+ target_link_libraries(vncpasswd pwquality)
+endif()
+
install(TARGETS vncpasswd DESTINATION ${CMAKE_INSTALL_FULL_BINDIR})
install(FILES vncpasswd.man DESTINATION ${CMAKE_INSTALL_FULL_MANDIR}/man1 RENAME vncpasswd.1)
#include <termios.h>
+#ifdef HAVE_PWQUALITY
+#include <pwquality.h>
+#endif
using namespace rfb;
return 0;
}
+#ifdef HAVE_PWQUALITY
+static int check_passwd_pwquality(const char *password)
+{
+ int r;
+ void *auxerror;
+ pwquality_settings_t *pwq;
+ pwq = pwquality_default_settings();
+ if (!pwq)
+ return -EINVAL;
+ r = pwquality_read_config(pwq, NULL, &auxerror);
+ if (r) {
+ printf("Cannot check password quality: %s \n",
+ pwquality_strerror(NULL, 0, r, auxerror));
+ pwquality_free_settings(pwq);
+ return -EINVAL;
+ }
+
+ r = pwquality_check(pwq, password, NULL, NULL, &auxerror);
+ if (r < 0) {
+ printf("Password quality check failed:\n %s \n",
+ pwquality_strerror(NULL, 0, r, auxerror));
+ r = -EPERM;
+ }
+ pwquality_free_settings(pwq);
+
+ //return the score of password quality
+ return r;
+}
+#endif
+
static std::vector<uint8_t> readpassword() {
while (true) {
const char *passwd = getpassword("Password:");
continue;
}
+#ifdef HAVE_PWQUALITY
+ //the function return score of password quality
+ int r = check_passwd_pwquality(passwd);
+ if (r < 0){
+ printf("Password quality check failed, please set it correctly.\n");
+ continue;
+ }
+#endif
+
passwd = getpassword("Verify:");
if (passwd == NULL) {
perror("getpass error");