Skip to content

Commit 45bdcb5

Browse files
committed
Don't use authorization for the first get system time call
We use get system time to compute time skew of the onvif device. However, some cameras would reject the call if credentials are provided with the wrong time. We should not add credentials for this initial call to prevent it form being rejected.
1 parent 445f742 commit 45bdcb5

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

pkg/gonvif/client.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,15 @@ type impl struct {
6262
}
6363

6464
func New(ctx context.Context, baseURL, username, password string, verbose bool) (Client, error) {
65-
soapClient, err := serviceSOAPClient(baseURL, "onvif/device_service", username, password, verbose, 0)
65+
diff, err := getTimeDiff(ctx, baseURL, verbose)
6666
if err != nil {
6767
return nil, err
6868
}
69-
d := device.NewDevice(soapClient)
70-
diff, err := getTimeDiff(ctx, d)
69+
soapClient, err := serviceSOAPClient(baseURL, "onvif/device_service", username, password, verbose, diff)
7170
if err != nil {
7271
return nil, err
7372
}
74-
soapClient.SetTimeDiff(diff)
73+
d := device.NewDevice(soapClient)
7574
resp, err := d.GetServicesContext(ctx, &device.GetServices{})
7675
if err != nil {
7776
return nil, fmt.Errorf("listing available Onvif services: %w", err)
@@ -116,7 +115,12 @@ func New(ctx context.Context, baseURL, username, password string, verbose bool)
116115
return &result, nil
117116
}
118117

119-
func getTimeDiff(ctx context.Context, d device.Device) (time.Duration, error) {
118+
func getTimeDiff(ctx context.Context, baseURL string, verbose bool) (time.Duration, error) {
119+
soapClient, err := unauthorizedServiceSOAPClient(baseURL, "onvif/device_service", verbose)
120+
if err != nil {
121+
return 0, err
122+
}
123+
d := device.NewDevice(soapClient)
120124
resp, err := d.GetSystemDateAndTimeContext(ctx, &device.GetSystemDateAndTime{})
121125
if err != nil {
122126
return 0, fmt.Errorf("getting Onvif device time: %w", err)
@@ -223,6 +227,14 @@ func sanitizeServiceURL(baseURL, advertisedURL string) (string, error) {
223227
return serviceURL(baseURL, u.RequestURI())
224228
}
225229

230+
func unauthorizedServiceSOAPClient(baseURL, advertisedURL string, verbose bool) (*soap.Client, error) {
231+
u, err := sanitizeServiceURL(baseURL, advertisedURL)
232+
if err != nil {
233+
return nil, err
234+
}
235+
return UnauthorizedSOAPClient(u, verbose), nil
236+
}
237+
226238
func serviceSOAPClient(
227239
baseURL, advertisedURL, username, password string, verbose bool, diff time.Duration,
228240
) (*soap.Client, error) {
@@ -233,6 +245,17 @@ func serviceSOAPClient(
233245
return AuthorizedSOAPClient(u, username, password, verbose, diff), nil
234246
}
235247

248+
func UnauthorizedSOAPClient(serviceURL string, verbose bool) *soap.Client {
249+
httpClient := http.DefaultClient
250+
if verbose {
251+
httpClient = verboseHTTPClient
252+
}
253+
client := soap.NewClient(serviceURL,
254+
soap.WithHTTPClient(httpClient),
255+
)
256+
return client
257+
}
258+
236259
func AuthorizedSOAPClient(
237260
serviceURL, username, password string, verbose bool, diff time.Duration,
238261
) *soap.Client {

0 commit comments

Comments
 (0)