1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
/*
* Copyright (C) 2004-2013 ZNC, see the NOTICE file for details.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define REQUIRESSL
#include <znc/FileUtils.h>
#include <znc/User.h>
#include <znc/Modules.h>
#include <znc/IRCSock.h>
class CCertMod : public CModule {
public:
void Delete(const CString &line) {
if (CFile::Delete(PemFile())) {
PutModule("Pem file deleted");
} else {
PutModule("The pem file doesn't exist or there was a error deleting the pem file.");
}
}
void Info(const CString &line) {
if (HasPemFile()) {
PutModule("You have a certificate in: " + PemFile());
} else {
PutModule("You do not have a certificate. Please use the web interface to add a certificate");
if (m_pUser->IsAdmin()) {
PutModule("Alternatively you can either place one at " + PemFile());
}
}
}
MODCONSTRUCTOR(CCertMod) {
AddHelpCommand();
AddCommand("delete", static_cast<CModCommand::ModCmdFunc>(&CCertMod::Delete),
"", "Delete the current certificate");
AddCommand("info", static_cast<CModCommand::ModCmdFunc>(&CCertMod::Info));
}
virtual ~CCertMod() {}
CString PemFile() const {
return GetSavePath() + "/user.pem";
}
bool HasPemFile() const {
return (CFile::Exists(PemFile()));
}
virtual EModRet OnIRCConnecting(CIRCSock *pIRCSock) {
if (HasPemFile()) {
pIRCSock->SetPemLocation(PemFile());
}
return CONTINUE;
}
virtual CString GetWebMenuTitle() { return "Certificate"; }
virtual bool OnWebRequest(CWebSock& WebSock, const CString& sPageName, CTemplate& Tmpl) {
if (sPageName == "index") {
Tmpl["Cert"] = CString(HasPemFile());
return true;
} else if (sPageName == "update") {
CFile fPemFile(PemFile());
if (fPemFile.Open(O_WRONLY | O_TRUNC | O_CREAT)) {
fPemFile.Write(WebSock.GetParam("cert", true, ""));
fPemFile.Close();
}
WebSock.Redirect(GetWebPath());
return true;
} else if (sPageName == "delete") {
CFile::Delete(PemFile());
WebSock.Redirect(GetWebPath());
return true;
}
return false;
}
};
template<> void TModInfo<CCertMod>(CModInfo& Info) {
Info.AddType(CModInfo::UserModule);
Info.SetWikiPage("cert");
}
NETWORKMODULEDEFS(CCertMod, "Use a ssl certificate to connect to a server")
|