@@ -2,7 +2,9 @@ package api
2
2
3
3
import (
4
4
"encoding/json"
5
+ "fmt"
5
6
"net/http"
7
+ "reflect"
6
8
"strconv"
7
9
8
10
"github.com/plaenkler/ddns-updater/pkg/cipher"
@@ -21,23 +23,16 @@ func CreateJob(w http.ResponseWriter, r *http.Request) {
21
23
return
22
24
}
23
25
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
31
26
params := r .FormValue ("params" )
32
- err = json . Unmarshal ([] byte ( params ), & jobModel )
27
+ err = verifyJobModel ( provider , params )
33
28
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 )
36
31
return
37
32
}
38
33
encParams , err := cipher .Encrypt (params )
39
34
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 )
41
36
http .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError )
42
37
return
43
38
}
@@ -47,13 +42,13 @@ func CreateJob(w http.ResponseWriter, r *http.Request) {
47
42
}
48
43
db := database .GetDatabase ()
49
44
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" )
51
46
http .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError )
52
47
return
53
48
}
54
49
err = db .Create (& job ).Error
55
50
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 )
57
52
http .Error (w , http .StatusText (http .StatusInternalServerError ), http .StatusInternalServerError )
58
53
return
59
54
}
@@ -75,24 +70,17 @@ func UpdateJob(w http.ResponseWriter, r *http.Request) {
75
70
return
76
71
}
77
72
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
85
73
params := r .FormValue ("params" )
86
- err = json . Unmarshal ([] byte ( params ), & jobModel )
74
+ err = verifyJobModel ( provider , params )
87
75
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 )
90
78
return
91
79
}
92
80
encParams , err := cipher .Encrypt (params )
93
81
if err != nil {
94
82
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 )
96
84
return
97
85
}
98
86
job := model.SyncJob {
@@ -105,17 +93,17 @@ func UpdateJob(w http.ResponseWriter, r *http.Request) {
105
93
db := database .GetDatabase ()
106
94
if db == nil {
107
95
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" )
109
97
return
110
98
}
111
99
err = db .Save (& job ).Error
112
100
if err != nil {
113
101
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 )
115
103
return
116
104
}
117
105
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 )
119
107
}
120
108
121
109
func DeleteJob (w http.ResponseWriter , r * http.Request ) {
@@ -150,3 +138,12 @@ func DeleteJob(w http.ResponseWriter, r *http.Request) {
150
138
http .Redirect (w , r , r .Header .Get ("Referer" ), http .StatusSeeOther )
151
139
log .Infof ("[api-DeleteJob-5] deleted job with ID %d" , job .ID )
152
140
}
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
+ }
0 commit comments