Skip to content
This repository was archived by the owner on May 8, 2022. It is now read-only.

Commit a7f455c

Browse files
committed
Add TLS mode support and checkbox in Settings -> General
1 parent 3a62a32 commit a7f455c

20 files changed

+247
-108
lines changed

README.md

+9
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,15 @@ gox -output="./xteve-build/{{.Dir}}_{{.OS}}_{{.Arch}}" ./
160160

161161
---
162162

163+
## Certificate generation
164+
165+
See:
166+
* <https://pkg.go.dev/net/http#ListenAndServeTLS>
167+
* <https://github.com/denji/golang-tls>
168+
* <https://gist.github.com/fntlnz/cf14feb5a46b2eda428e000157447309>
169+
170+
---
171+
163172
## Fork without pull request :mega:
164173

165174
When creating a fork, the xTeVe GitHub account must be changed from the source code or the update function disabled.

certeficates/xteve.crt

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDhTCCAm2gAwIBAgIURgwIxlYujaBGZneE0xkvk9VWzeAwDQYJKoZIhvcNAQEL
3+
BQAwUjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxDjAMBgNVBAoM
4+
BXh0ZXZlMQ4wDAYDVQQLDAV4dGV2ZTEOMAwGA1UEAwwFeHRldmUwHhcNMjIwNDIw
5+
MjMzNzU3WhcNMzIwNDE3MjMzNzU3WjBSMQswCQYDVQQGEwJBVTETMBEGA1UECAwK
6+
U29tZS1TdGF0ZTEOMAwGA1UECgwFeHRldmUxDjAMBgNVBAsMBXh0ZXZlMQ4wDAYD
7+
VQQDDAV4dGV2ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOdrEV93
8+
ZcxZP47CrzpVWF6dMXeS7nYcyK7aQOoDl2oDj7m5JKsPjl/khRiAUxQ0QgIFVCSi
9+
Xgod4FFjj1HWc7qgpEqyulCP3GR8vnrP63iGptVO8ffU034BifevwyRqEj8Vy11d
10+
uFrn0FxmpSCW8o28TPnEebuZcTVx+zARFEc+Hc48JgTsRIaGbWCnkJ5VQ0Uq6+td
11+
cjHzM7l7yK+xAPOSP4jLQ+zfY5n6C/cjBzZqf/oQU0JuSr12xF17Eccx+EPNdwhk
12+
OLNmcvDEcKAEv9OSzLv3csn8zIqRnpCEYehPBGL+CX5Rz8Vn6/qb2fmqf53B0leV
13+
PmEmjvUOAVj053MCAwEAAaNTMFEwHQYDVR0OBBYEFLfYxsVRzA8l3RuPUp2N+bbv
14+
xVscMB8GA1UdIwQYMBaAFLfYxsVRzA8l3RuPUp2N+bbvxVscMA8GA1UdEwEB/wQF
15+
MAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEiL4LcPZ4HVeTxqrNQjRV2SJNJmUMT2
16+
AWBrpH4bbKPVgdOJGvQkH4K8OW/P5dCvIum+PZFUR+jkgv2EUppZCU7R6mGyhDBA
17+
DBQU7z0R5NdB+bKqKP/Wxs30r6u1lCELQA1PC4PQt04MXKTmLoOscHTTE9qBhrnv
18+
Un8sEr0SHwxtrSupLRRcRMzZvz9q9s9xOjZQa3gNnUsGv9aPrjnrCsBflQ4Vrzym
19+
70aj379sQ8lpkml+0pKiJ+S2aRmt9jQ47fODYSB8A/0iDJSQ4WiOuItiJIQ1q5qV
20+
T6PGzJotCXk9ZXCz84ZZnVcIKFEC9cNWGxdDq/y04t8poyxXLwWRbnY=
21+
-----END CERTIFICATE-----

certeficates/xteve.key

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEpgIBAAKCAQEA52sRX3dlzFk/jsKvOlVYXp0xd5LudhzIrtpA6gOXagOPubkk
3+
qw+OX+SFGIBTFDRCAgVUJKJeCh3gUWOPUdZzuqCkSrK6UI/cZHy+es/reIam1U7x
4+
99TTfgGJ96/DJGoSPxXLXV24WufQXGalIJbyjbxM+cR5u5lxNXH7MBEURz4dzjwm
5+
BOxEhoZtYKeQnlVDRSrr611yMfMzuXvIr7EA85I/iMtD7N9jmfoL9yMHNmp/+hBT
6+
Qm5KvXbEXXsRxzH4Q813CGQ4s2Zy8MRwoAS/05LMu/dyyfzMipGekIRh6E8EYv4J
7+
flHPxWfr+pvZ+ap/ncHSV5U+YSaO9Q4BWPTncwIDAQABAoIBAQDb1viQCmrob7hT
8+
NFsmPUFP0GDXyPtDtSBoCuoz5OmISo3Uzy8oWgTUz9AocG97+BDkvo8qphxT3AHn
9+
D39tLR6Pol+wno0kTyX9SAvju3Vj7/a5GOAAoWuwfmHErHHjO+jNiTTCI3Ao26My
10+
xEgF55/QSZuOgrlqH+BN91O6W985tNfNHoIbAVjiDm3R8VDB+tjhBoFW5ZLQn8Xa
11+
/lKAlEZ3tmzwi8QxCRxX1JYQ09UD9E/RV1DCbOaownyplocjVNwWd0wTQ7/Peqr5
12+
+/lvN9DiRGgPWogX0cvmNYoLFP+98s++v8zvJWI6uO3P7LzQIClXowxE12KNzUKE
13+
2zuf93pBAoGBAP6XDwnjmgttldlxcwhuDEo6enl5kvfzELSoYwvO63xJi/+lLd/E
14+
/83ePBiBgoZFdzBLuNaQUZVibzlt5PJUtlejoTap98+0hcjU+Dw416AkQ2eHabXj
15+
JjuiXPb5Gio3FIN55HnTTme8LQiyF0g9Ok+w/YvOjeTfJa1UMlkyRdsRAoGBAOiz
16+
KFfewniBdZt1KrwI3JAGGDr+W3koxtI3BBszqA5dPjGVeA1M6pt+kbk+zI0dBleY
17+
AmUDHDPKU4RXDc0rESwUhKF/kxMAh1O25Tt0RY5vWRcDlAgKoPbVVZLbSkwkHx6S
18+
VxXHT2wEFdqJrmrZp047Be9hIuKziVJijiMNL3JDAoGBAJJq2AhM8Jwf8y1yFMFF
19+
YSYTibpxE/grv3DW4te4si/xsGVfXwmxp5iDdjZ1zVZhfxG0iuJDb9glG2iA7kn8
20+
ND4k6iOhDtdSsBp3eShRXJlKIcXZ2A72S1fCogqb6tNaiB6xLJhv0UjRrWix27f9
21+
FpscZEVSjsKRH38WzDoGMqyxAoGBALhjtrUiO+E3XFTqHAnRz8yEN9EPWraAHEPY
22+
+nT/ksyHEFBEC1QmvcSnH5u1amrrM+pW9pbKRx+21EUKolIQLVRLkelS6Nzmz1UD
23+
mVNqR++cxfCZkkRo/7F3zI5JG++Hs+0Kstz8CTAjcJmx/baHb65q0MIlq3oOH+Nb
24+
WxvlR9J3AoGBALFFee66OHfgHx/pi+/NUWo9DHPcypGmJskmmNm+Z94utpyZrSxj
25+
KiiZi79cQiNTzBwANQ9h5lvGguKONE4v4vLTrqzOnaCCVGm/Q/I4cAXwidjTZmhC
26+
v6Pw1OPHRglCDuXUy2v7eDPXpusJ36Rp4y/+ALu4tnBk6eZ3b02zw6qB
27+
-----END RSA PRIVATE KEY-----

html/js/base_ts.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ menuItems.push(new MainMenuItem("log", "{{.mainMenu.item.log}}", "log.png", "{{.
1818
menuItems.push(new MainMenuItem("logout", "{{.mainMenu.item.logout}}", "logout.png", "{{.mainMenu.headline.logout}}"));
1919
// Settings categories
2020
var settingsCategory = new Array();
21-
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "xteveAutoUpdate,tuner,epgSource,api"));
21+
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.general}}", "tlsMode,xteveAutoUpdate,tuner,epgSource,api"));
2222
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.files}}", "update,files.update,temp.path,cache.images,xepg.replace.missing.images"));
2323
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.streaming}}", "buffer,udpxy,buffer.size.kb,buffer.timeout,user.agent,ffmpeg.path,ffmpeg.options,vlc.path,vlc.options"));
2424
settingsCategory.push(new SettingsCategoryItem("{{.settings.category.backup}}", "backup.path,backup.keep"));

html/js/network_ts.js

+11-15
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ class Server {
77
return;
88
}
99
SERVER_CONNECTION = true;
10-
console.log(data);
1110
if (this.cmd != "updateLog") {
1211
showElement("loading", true);
1312
UNDO = new Object();
@@ -25,35 +24,32 @@ class Server {
2524
var ws = new WebSocket(url);
2625
ws.onopen = function () {
2726
WS_AVAILABLE = true;
28-
console.log("REQUEST (JS):");
29-
console.log(data);
30-
console.log("REQUEST: (JSON)");
31-
console.log(JSON.stringify(data));
3227
this.send(JSON.stringify(data));
3328
};
34-
ws.onerror = function (e) {
29+
ws.onerror = function (wsErrEvt) {
3530
console.log("No websocket connection to xTeVe could be established. Check your network configuration.");
3631
SERVER_CONNECTION = false;
3732
if (WS_AVAILABLE == false) {
3833
alert("No websocket connection to xTeVe could be established. Check your network configuration.");
3934
}
4035
};
41-
ws.onmessage = function (e) {
36+
ws.onmessage = function (wsMessageEvt) {
4237
SERVER_CONNECTION = false;
4338
showElement("loading", false);
44-
console.log("RESPONSE:");
45-
var response = JSON.parse(e.data);
46-
console.log(response);
39+
const response = JSON.parse(wsMessageEvt.data);
4740
if (response.hasOwnProperty("token")) {
4841
document.cookie = "Token=" + response["token"];
4942
}
5043
if (response["status"] == false) {
5144
alert(response["err"]);
52-
if (response.hasOwnProperty("reload")) {
53-
location.reload();
54-
}
5545
return;
5646
}
47+
if (response.hasOwnProperty("newWebUrl")) {
48+
window.location = response["newWebUrl"];
49+
}
50+
if (response.hasOwnProperty("reload")) {
51+
window.location.reload();
52+
}
5753
if (response.hasOwnProperty("alert")) {
5854
alert(response["alert"]);
5955
}
@@ -70,7 +66,6 @@ class Server {
7066
showLogs(false);
7167
}
7268
return;
73-
break;
7469
default:
7570
SERVER = new Object();
7671
SERVER = response;
@@ -99,6 +94,7 @@ class Server {
9994
function getCookie(name) {
10095
var value = "; " + document.cookie;
10196
var parts = value.split("; " + name + "=");
102-
if (parts.length == 2)
97+
if (parts.length == 2) {
10398
return parts.pop().split(";").shift();
99+
}
104100
}

html/js/settings_ts.js

+14
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,17 @@ class SettingsCategory {
117117
setting.appendChild(tdRight);
118118
break;
119119
// Checkboxes
120+
case "tlsMode":
121+
var tdLeft = document.createElement("TD");
122+
tdLeft.innerHTML = "{{.settings.tlsMode.title}}" + ":";
123+
var tdRight = document.createElement("TD");
124+
var input = content.createCheckbox(settingsKey);
125+
input.checked = data;
126+
input.setAttribute("onchange", "javascript: this.className = 'changed'");
127+
tdRight.appendChild(input);
128+
setting.appendChild(tdLeft);
129+
setting.appendChild(tdRight);
130+
break;
120131
case "authentication.web":
121132
var tdLeft = document.createElement("TD");
122133
tdLeft.innerHTML = "{{.settings.authenticationWEB.title}}" + ":";
@@ -310,6 +321,9 @@ class SettingsCategory {
310321
var description = document.createElement("TR");
311322
var text;
312323
switch (settingsKey) {
324+
case "tlsMode":
325+
text = "{{.settings.tlsMode.description}}";
326+
break;
313327
case "authentication.web":
314328
text = "{{.settings.authenticationWEB.description}}";
315329
break;

html/lang/en.json

+4
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,10 @@
397397
"title": "Number of Tuners",
398398
"description": "Number of parallel connections that can be established to the provider.<br>Available for: Plex, Emby (HDHR), M3U (with active buffer).<br>After a change, xTeVe must be delete in the Plex / Emby DVR settings and set up again."
399399
},
400+
"tlsMode": {
401+
"title": "TLS (HTTPS) mode",
402+
"description": "Changes web server protocol to HTTPS. Requires xteve.crt and xteve.key in xTeVe config /certificates directory."
403+
},
400404
"filesUpdate":
401405
{
402406
"title": "Updates all files at startup",

src/backup.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
func xTeVeAutoBackup() (err error) {
1515

16-
var archiv = "xteve_auto_backup_" + time.Now().Format("20060102_1504") + ".zip"
16+
var archive = "xteve_auto_backup_" + time.Now().Format("20060102_1504") + ".zip"
1717
var target string
1818
var sourceFiles = make([]string, 0)
1919
var oldBackupFiles = make([]string, 0)
@@ -74,13 +74,16 @@ func xTeVeAutoBackup() (err error) {
7474
// Create a Backup
7575
if err == nil {
7676

77-
target = System.Folder.Backup + archiv
77+
target = System.Folder.Backup + archive
7878

7979
for _, i := range SystemFiles {
8080
sourceFiles = append(sourceFiles, System.Folder.Config+i)
8181
}
8282

8383
sourceFiles = append(sourceFiles, System.Folder.ImagesUpload)
84+
if Settings.TLSMode {
85+
sourceFiles = append(sourceFiles, System.Folder.Certificates)
86+
}
8487

8588
err = zipFiles(sourceFiles, target)
8689

@@ -98,23 +101,26 @@ func xTeVeAutoBackup() (err error) {
98101
return
99102
}
100103

101-
func xteveBackup() (archiv string, err error) {
104+
func xteveBackup() (archive string, err error) {
102105

103106
err = checkFolder(System.Folder.Temp)
104107
if err != nil {
105108
return
106109
}
107110

108-
archiv = "xteve_backup_" + time.Now().Format("20060102_1504") + ".zip"
111+
archive = "xteve_backup_" + time.Now().Format("20060102_1504") + ".zip"
109112

110-
var target = System.Folder.Temp + archiv
113+
var target = System.Folder.Temp + archive
111114
var sourceFiles = make([]string, 0)
112115

113116
for _, i := range SystemFiles {
114117
sourceFiles = append(sourceFiles, System.Folder.Config+i)
115118
}
116119

117120
sourceFiles = append(sourceFiles, System.Folder.Data)
121+
if Settings.TLSMode {
122+
sourceFiles = append(sourceFiles, System.Folder.Certificates)
123+
}
118124

119125
err = zipFiles(sourceFiles, target)
120126
if err != nil {

src/config.go

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func Init() (err error) {
7373
System.Folder.Backup = System.Folder.Config + "backup" + string(os.PathSeparator)
7474
System.Folder.Data = System.Folder.Config + "data" + string(os.PathSeparator)
7575
System.Folder.Cache = System.Folder.Config + "cache" + string(os.PathSeparator)
76+
System.Folder.Certificates = System.Folder.Config + "certificates" + string(os.PathSeparator)
7677
System.Folder.ImagesCache = System.Folder.Cache + "images" + string(os.PathSeparator)
7778
System.Folder.ImagesUpload = System.Folder.Data + "images" + string(os.PathSeparator)
7879
System.Folder.Temp = getDefaultTempDir()

src/screen.go

+2
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ func getErrMsg(errCode int) (errMsg string) {
251251
errMsg = fmt.Sprintf("Invalid filter rule")
252252
case 1015:
253253
errMsg = fmt.Sprintf("Specified temp folder path is invalid, fallback to %s", os.TempDir())
254+
case 1016:
255+
errMsg = fmt.Sprintf("Web server could not be stopped.")
254256

255257
case 1020:
256258
errMsg = fmt.Sprintf("Data could not be saved, invalid keyword")

src/struct-system.go

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type SystemStruct struct {
6060
Folder struct {
6161
Backup string
6262
Cache string
63+
Certificates string
6364
Config string
6465
Data string
6566
ImagesCache string
@@ -303,6 +304,7 @@ type SettingsStruct struct {
303304
Port string `json:"port"`
304305
SSDP bool `json:"ssdp"`
305306
TempPath string `json:"temp.path"`
307+
TLSMode bool `json:"tlsMode"`
306308
Tuner int `json:"tuner"`
307309
Update []string `json:"update"`
308310
UpdateURL string `json:"update.url,omitempty"`

src/struct-webserver.go

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type RequestStruct struct {
3636
VLCPath *string `json:"vlc.path,omitempty"`
3737
FilesUpdate *bool `json:"files.update,omitempty"`
3838
TempPath *string `json:"temp.path,omitempty"`
39+
TLSMode *bool `json:"tlsMode,omitempty"`
3940
Tuner *int `json:"tuner,omitempty"`
4041
UDPxy *string `json:"udpxy,omitempty"`
4142
Update *[]string `json:"update,omitempty"`
@@ -107,6 +108,7 @@ type ResponseStruct struct {
107108
Error string `json:"err,omitempty"`
108109
Log WebScreenLogStruct `json:"log,required"`
109110
LogoURL string `json:"logoURL,omitempty"`
111+
NewWebURL string `json:"newWebUrl,omitempty"`
110112
OpenLink string `json:"openLink,omitempty"`
111113
OpenMenu string `json:"openMenu,omitempty"`
112114
Reload bool `json:"reload,omitempty"`

src/system.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -112,32 +112,33 @@ func loadSettings() (settings SettingsStruct, err error) {
112112
defaults["authentication.xml"] = false
113113
defaults["backup.keep"] = 10
114114
defaults["backup.path"] = System.Folder.Backup
115-
defaults["buffer"] = "-"
116115
defaults["buffer.size.kb"] = 1024
117116
defaults["buffer.timeout"] = 500
117+
defaults["buffer"] = "-"
118118
defaults["cache.images"] = false
119119
defaults["epgSource"] = "PMS"
120120
defaults["ffmpeg.options"] = System.FFmpeg.DefaultOptions
121-
defaults["vlc.options"] = System.VLC.DefaultOptions
122-
defaults["files"] = dataMap
123121
defaults["files.update"] = true
122+
defaults["files"] = dataMap
124123
defaults["filter"] = make(map[string]interface{})
125124
defaults["git.branch"] = System.Branch
126125
defaults["language"] = "en"
127126
defaults["log.entries.ram"] = 500
128-
defaults["mapping.first.channel"] = 1000
129-
defaults["xepg.replace.missing.images"] = true
130127
defaults["m3u8.adaptive.bandwidth.mbps"] = 10
128+
defaults["mapping.first.channel"] = 1000
131129
defaults["port"] = "34400"
132130
defaults["ssdp"] = true
131+
defaults["temp.path"] = System.Folder.Temp
132+
defaults["tlsMode"] = false
133133
defaults["tuner"] = 1
134+
defaults["udpxy"] = ""
134135
defaults["update"] = []string{"0000"}
135136
defaults["user.agent"] = System.Name
136137
defaults["uuid"] = createUUID()
137-
defaults["udpxy"] = ""
138138
defaults["version"] = System.DBVersion
139+
defaults["vlc.options"] = System.VLC.DefaultOptions
140+
defaults["xepg.replace.missing.images"] = true
139141
defaults["xteveAutoUpdate"] = true
140-
defaults["temp.path"] = System.Folder.Temp
141142

142143
// Set Default Values
143144
for key, value := range defaults {
@@ -223,6 +224,14 @@ func setGlobalDomain(domain string) {
223224

224225
System.Domain = domain
225226

227+
if Settings.TLSMode {
228+
System.ServerProtocol.API = "https"
229+
System.ServerProtocol.DVR = "https"
230+
System.ServerProtocol.M3U = "https"
231+
System.ServerProtocol.WEB = "https"
232+
System.ServerProtocol.XML = "https"
233+
}
234+
226235
switch Settings.AuthenticationPMS {
227236
case true:
228237
System.Addresses.DVR = "username:password@" + System.Domain

src/update.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ checkVersion:
265265

266266
goto checkVersion
267267

268-
case "2.2.0", "2.2.1":
268+
case "2.2.0", "2.2.1", "2.2.2":
269269
// If there are changes to the Database in a later update, continue here
270270

271271
break

0 commit comments

Comments
 (0)