Skip to content

Commit a5ab211

Browse files
authored
Merge pull request #388 from Plaenkler/fix-missing-pointer
[FIX] Use reflect
2 parents 80d1ed4 + 89c7982 commit a5ab211

File tree

3 files changed

+27
-29
lines changed

3 files changed

+27
-29
lines changed

pkg/ddns/service.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ddns
22

33
import (
44
"encoding/json"
5+
"reflect"
56
"sync"
67
"time"
78

@@ -88,7 +89,7 @@ func updateDDNSEntries(db *gorm.DB, jobs []model.SyncJob, a model.IPAddress) {
8889
log.Errorf("[ddns-updateDDNSEntries-2] failed to decrypt job params for job %v: %s", job.ID, err)
8990
continue
9091
}
91-
request := updater.Request
92+
request := reflect.New(reflect.TypeOf(updater.Request)).Interface()
9293
err = json.Unmarshal(params, &request)
9394
if err != nil {
9495
log.Errorf("[ddns-updateDDNSEntries-3] failed to unmarshal job params for job %v: %s", job.ID, err)

pkg/server/routes/api/job.go

+24-27
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package api
22

33
import (
44
"encoding/json"
5+
"fmt"
56
"net/http"
7+
"reflect"
68
"strconv"
79

810
"github.com/plaenkler/ddns-updater/pkg/cipher"
@@ -21,23 +23,16 @@ func CreateJob(w http.ResponseWriter, r *http.Request) {
2123
return
2224
}
2325
provider := r.FormValue("provider")
24-
updater, ok := ddns.GetUpdaters()[provider]
25-
if !ok {
26-
http.Error(w, "Invalid provider", http.StatusBadRequest)
27-
log.Errorf("[api-CreateJob-2] provider is not valid")
28-
return
29-
}
30-
jobModel := updater.Request
3126
params := r.FormValue("params")
32-
err = json.Unmarshal([]byte(params), &jobModel)
27+
err = verifyJobModel(provider, params)
3328
if err != nil {
34-
log.Errorf("[api-CreateJob-3] could not unmarshal params: %s", err)
35-
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
29+
http.Error(w, "Invalid values", http.StatusBadRequest)
30+
log.Errorf("[api-UpdateJob-2] invalid values: %s", err)
3631
return
3732
}
3833
encParams, err := cipher.Encrypt(params)
3934
if err != nil {
40-
log.Errorf("[api-CreateJob-4] could not encrypt params: %s", err)
35+
log.Errorf("[api-CreateJob-3] could not encrypt params: %s", err)
4136
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
4237
return
4338
}
@@ -47,13 +42,13 @@ func CreateJob(w http.ResponseWriter, r *http.Request) {
4742
}
4843
db := database.GetDatabase()
4944
if db == nil {
50-
log.Errorf("[api-CreateJob-5] could not get database connection")
45+
log.Errorf("[api-CreateJob-4] could not get database connection")
5146
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
5247
return
5348
}
5449
err = db.Create(&job).Error
5550
if err != nil {
56-
log.Errorf("[api-CreateJob-6] could not create job: %s", err)
51+
log.Errorf("[api-CreateJob-5] could not create job: %s", err)
5752
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
5853
return
5954
}
@@ -75,24 +70,17 @@ func UpdateJob(w http.ResponseWriter, r *http.Request) {
7570
return
7671
}
7772
provider := r.FormValue("provider")
78-
updater, ok := ddns.GetUpdaters()[provider]
79-
if !ok {
80-
http.Error(w, "Invalid provider", http.StatusBadRequest)
81-
log.Errorf("[api-UpdateJob-3] provider is not valid")
82-
return
83-
}
84-
jobModel := updater.Request
8573
params := r.FormValue("params")
86-
err = json.Unmarshal([]byte(params), &jobModel)
74+
err = verifyJobModel(provider, params)
8775
if err != nil {
88-
http.Error(w, "Could not unmarshal params", http.StatusBadRequest)
89-
log.Errorf("[api-UpdateJob-4] could not unmarshal params: %s", err)
76+
http.Error(w, "Invalid values", http.StatusBadRequest)
77+
log.Errorf("[api-UpdateJob-3] invalid values: %s", err)
9078
return
9179
}
9280
encParams, err := cipher.Encrypt(params)
9381
if err != nil {
9482
http.Error(w, "Could not encrypt params", http.StatusInternalServerError)
95-
log.Errorf("[api-UpdateJob-5] could not encrypt params: %s", err)
83+
log.Errorf("[api-UpdateJob-4] could not encrypt params: %s", err)
9684
return
9785
}
9886
job := model.SyncJob{
@@ -105,17 +93,17 @@ func UpdateJob(w http.ResponseWriter, r *http.Request) {
10593
db := database.GetDatabase()
10694
if db == nil {
10795
http.Error(w, "Could not get database connection", http.StatusInternalServerError)
108-
log.Errorf("[api-UpdateJob-6] could not get database connection")
96+
log.Errorf("[api-UpdateJob-5] could not get database connection")
10997
return
11098
}
11199
err = db.Save(&job).Error
112100
if err != nil {
113101
http.Error(w, "Could not update job", http.StatusInternalServerError)
114-
log.Errorf("[api-UpdateJob-7] could not update job: %s", err)
102+
log.Errorf("[api-UpdateJob-6] could not update job: %s", err)
115103
return
116104
}
117105
http.Redirect(w, r, r.Header.Get("Referer"), http.StatusSeeOther)
118-
log.Infof("[api-UpdateJob-8] updated job with ID %d", job.ID)
106+
log.Infof("[api-UpdateJob-7] updated job with ID %d", job.ID)
119107
}
120108

121109
func DeleteJob(w http.ResponseWriter, r *http.Request) {
@@ -150,3 +138,12 @@ func DeleteJob(w http.ResponseWriter, r *http.Request) {
150138
http.Redirect(w, r, r.Header.Get("Referer"), http.StatusSeeOther)
151139
log.Infof("[api-DeleteJob-5] deleted job with ID %d", job.ID)
152140
}
141+
142+
func verifyJobModel(provider, params string) error {
143+
updater, ok := ddns.GetUpdaters()[provider]
144+
if !ok {
145+
return fmt.Errorf("provider is not valid")
146+
}
147+
jobModel := reflect.New(reflect.TypeOf(updater.Request)).Interface()
148+
return json.Unmarshal([]byte(params), &jobModel)
149+
}

pkg/server/routes/web/static/js/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ document.querySelector('table tbody').addEventListener('click', function(event)
2424
document.getElementById('edit-id').value = row.querySelector('td:nth-child(1)').textContent;
2525
document.getElementById('delete-button').href = `/api/job/delete?ID=${row.querySelector('td:nth-child(1)').textContent}`;
2626
document.getElementById('edit-provider-select').value = row.querySelector('td:nth-child(2)').textContent;
27-
const params = JSON.parse(document.querySelector('td:nth-child(4)').getAttribute('json'));
27+
const params = JSON.parse(row.querySelector('td:nth-child(4)').getAttribute('json'));
2828
let html = '';
2929
for (const key in params) {
3030
html += `

0 commit comments

Comments
 (0)