Guest User

Untitled

a guest
Jan 21st, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. extern "C" {
  2. #include <ykclient.h>
  3. }
  4.  
  5. #include "Modules.h"
  6. #include "znc.h"
  7. #include "User.h"
  8.  
  9. #define CLIENT_ID 1
  10. #define DEFAULT_TOKEN_ID_LEN 12
  11.  
  12. class CYubikeyMod : public CModule {
  13. public:
  14. MODCONSTRUCTOR(CYubikeyMod) {
  15. AddHelpCommand();
  16. AddCommand("Add", static_cast<CModCommand::ModCmdFunc>(&CYubikeyMod::AddTokenCommand), "<token>");
  17. AddCommand("Del", static_cast<CModCommand::ModCmdFunc>(&CYubikeyMod::DelTokenCommand), "<token>");
  18. AddCommand("List", static_cast<CModCommand::ModCmdFunc>(&CYubikeyMod::ListTokens));
  19. }
  20.  
  21. virtual ~CYubikeyMod() {}
  22.  
  23. virtual EModRet OnLoginAttempt(CSmartPtr<CAuthBase> Auth) {
  24. CString const sPassword = Auth->GetPassword();
  25. CUser *pUser = CZNC::Get().FindUser(Auth->GetUsername());
  26.  
  27. if (pUser && CheckToken(pUser, sPassword.Left(DEFAULT_TOKEN_ID_LEN))) {
  28. DEBUG("yubikey: Lookup for " << sPassword.Left(DEFAULT_TOKEN_ID_LEN));
  29. // The following call is blocking.
  30. //int result = ykclient_verify_otp(sPassword.c_str(), CLIENT_ID, NULL);
  31. int result = ykclient_verify_otp_v2(NULL, sPassword.c_str(), CLIENT_ID, NULL, 0, NULL, NULL);
  32. DEBUG("yubikey: " << ykclient_strerror(result));
  33.  
  34. if (result == YKCLIENT_OK) {
  35. Auth->AcceptLogin(*pUser);
  36. } else {
  37. Auth->RefuseLogin(ykclient_strerror(result));
  38. }
  39.  
  40. return HALT;
  41. }
  42.  
  43. return CONTINUE;
  44. }
  45.  
  46. SCString GetUserTokens(CUser *pUser) {
  47. SCString ssTokens;
  48. GetNV(pUser->GetUserName()).Split(" ", ssTokens);
  49. return ssTokens;
  50. }
  51.  
  52. void SetUserTokens(CUser *pUser, SCString ssTokens) {
  53. CString sVal;
  54.  
  55. for (SCString::const_iterator it = ssTokens.begin(); it != ssTokens.end(); ++it) {
  56. sVal += *it + " ";
  57. }
  58.  
  59. SetNV(pUser->GetUserName(), sVal);
  60. }
  61.  
  62. bool CheckToken(CUser *pUser, CString sToken) {
  63. SCString ssTokens = GetUserTokens(pUser);
  64. return ssTokens.find(sToken) != ssTokens.end();
  65. }
  66.  
  67. void AddToken(CString sToken) {
  68. SCString ssTokens = GetUserTokens(m_pUser);
  69. SCString::iterator it = ssTokens.find(sToken);
  70.  
  71. if (it == ssTokens.end()) {
  72. ssTokens.insert(sToken);
  73. SetUserTokens(m_pUser, ssTokens);
  74. }
  75. }
  76.  
  77. void DelToken(const CString sToken) {
  78. SCString ssTokens = GetUserTokens(m_pUser);
  79. SCString::iterator it = ssTokens.find(sToken);
  80.  
  81. if (it != ssTokens.end()) {
  82. ssTokens.erase(it);
  83. SetUserTokens(m_pUser, ssTokens);
  84. }
  85. }
  86.  
  87. void AddTokenCommand(const CString& sLine) {
  88. CString sToken = sLine.Token(1).Left(DEFAULT_TOKEN_ID_LEN);
  89.  
  90. if (sToken.length() != 12) {
  91. PutModule("Invalid token ID");
  92. return;
  93. }
  94.  
  95. AddToken(sToken);
  96. PutModule(sToken + " added");
  97. }
  98.  
  99. void DelTokenCommand(const CString& sLine) {
  100. CString sToken = sLine.Token(1).Left(DEFAULT_TOKEN_ID_LEN);
  101.  
  102. if (sToken.length() != 12) {
  103. PutModule("Invalid token ID");
  104. return;
  105. }
  106.  
  107. DelToken(sToken);
  108. PutModule(sToken + " removed");
  109. }
  110.  
  111. void ListTokens(const CString& sLine) {
  112. SCString ssTokens = GetUserTokens(m_pUser);
  113.  
  114. CTable table;
  115. table.AddColumn("Tolken");
  116.  
  117. for (SCString::const_iterator it = ssTokens.begin(); it != ssTokens.end(); ++it) {
  118. table.AddRow();
  119. table.SetCell("Token", *it);
  120. }
  121.  
  122. if (PutModule(table) == 0) {
  123. PutModule("No tokens set for your user");
  124. }
  125. }
  126. };
  127.  
  128. GLOBALMODULEDEFS(CYubikeyMod, "Allow users to authenticate with a yubikey")
Add Comment
Please, Sign In to add comment