Skip to content

Commit 13e9728

Browse files
committed
Add privacy support to Logger in Dataconnect
1 parent d69a78f commit 13e9728

File tree

5 files changed

+46
-178
lines changed

5 files changed

+46
-178
lines changed

Sources/DataConnect.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Foundation
1717
import FirebaseAppCheck
1818
import FirebaseAuth
1919
import FirebaseCore
20+
import OSLog
2021

2122
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
2223
public class DataConnect {
@@ -31,6 +32,8 @@ public class DataConnect {
3132

3233
private static var instanceStore = InstanceStore()
3334

35+
static let logger = Logger(subsystem: "com.google.firebase", category: "data_connect")
36+
3437
public enum EmulatorDefaults {
3538
public static let host = "127.0.0.1"
3639
public static let port = 9399

Sources/Internal/CodableTimestamp.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ extension CodableTimestamp {
5252
.firstMatch(in: timestampString, range: NSRange(location: 0,
5353
length: timestampString.count)) !=
5454
nil else {
55-
FirebaseLogger.dataConnect
55+
DataConnect.logger
5656
.error(
57-
"Timestamp string format doesn't support."
57+
"Timestamp string \(timestampString, privacy: .private) format doesn't support."
5858
)
5959
throw DataConnectError.invalidTimestampFormat
6060
}

Sources/Internal/FirebaseLogger/DataConnectLogger.swift

Lines changed: 0 additions & 18 deletions
This file was deleted.

Sources/Internal/FirebaseLogger/FirebaseLogger.swift

Lines changed: 0 additions & 54 deletions
This file was deleted.

Sources/Internal/GrpcClient.swift

Lines changed: 41 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,6 @@ actor GrpcClient: CustomStringConvertible {
5050

5151
private let callerSDKType: CallerSDKType
5252

53-
// Remove debug flag when logging privacy is properly handled.
54-
private let debugEnable = false
55-
5653
enum RequestHeaders {
5754
static let googRequestParamsHeader = "x-goog-request-params"
5855
static let authorizationHeader = "x-firebase-auth-token"
@@ -65,11 +62,8 @@ actor GrpcClient: CustomStringConvertible {
6562

6663
private lazy var client: FirebaseDataConnectAsyncClient? = {
6764
do {
68-
if debugEnable == true {
69-
FirebaseLogger.dataConnect.debug("\(self.description) initialization starts.")
70-
} else {
71-
FirebaseLogger.dataConnect.debug("GrpcClient initialization starts.")
72-
}
65+
DataConnect.logger
66+
.debug("GrpcClient \(self.description, privacy: .private) initialization starts.")
7367
let group = PlatformSupport.makeEventLoopGroup(loopCount: threadPoolSize)
7468
let channel = try GRPCChannelPool.with(
7569
target: .host(serverSettings.host, port: serverSettings.port),
@@ -78,18 +72,11 @@ actor GrpcClient: CustomStringConvertible {
7872
.plaintext,
7973
eventLoopGroup: group
8074
)
81-
if debugEnable == true {
82-
FirebaseLogger.dataConnect.debug("\(self.description) has been created.")
83-
} else {
84-
FirebaseLogger.dataConnect.debug("GrpcClient has been created.")
85-
}
75+
DataConnect.logger.debug("GrpcClient\(self.description, privacy: .private) has been created.")
8676
return FirebaseDataConnectAsyncClient(channel: channel)
8777
} catch {
88-
if debugEnable == true {
89-
FirebaseLogger.dataConnect.error("Error:\(error) when creating \(self.description).")
90-
} else {
91-
FirebaseLogger.dataConnect.debug("Error:\(error) when creating GrpcClient.")
92-
}
78+
DataConnect.logger
79+
.debug("Error:\(error) when creating GrpcClient\(self.description, privacy: .private).")
9380
return nil
9481
}
9582
}()
@@ -130,8 +117,7 @@ actor GrpcClient: CustomStringConvertible {
130117
googRequestHeaderValue = "location=\(self.connectorConfig.location)&frontend=data"
131118

132119
description = """
133-
GrpcClient: \
134-
projectId=\(projectId) \
120+
: projectId=\(projectId) \
135121
connector=\(connectorConfig.connector) \
136122
host=\(serverSettings.host) \
137123
port=\(serverSettings.port) \
@@ -145,7 +131,7 @@ actor GrpcClient: CustomStringConvertible {
145131
.Type)
146132
async throws -> OperationResult<ResultType> {
147133
guard let client else {
148-
FirebaseLogger.dataConnect
134+
DataConnect.logger
149135
.error("When calling executeQuery(), grpc client has not been configured.")
150136
throw DataConnectError.grpcNotConfigured
151137
}
@@ -155,49 +141,29 @@ actor GrpcClient: CustomStringConvertible {
155141
connectorName: connectorName,
156142
request: request
157143
)
144+
let requestString = try " " + grpcRequest.jsonString()
158145

159146
do {
160-
if debugEnable == true {
161-
try FirebaseLogger.dataConnect
162-
.debug("executeQuery() sends grpc request: \(grpcRequest.jsonString()).")
163-
} else {
164-
try FirebaseLogger.dataConnect
165-
.debug("executeQuery() sends grpc request.")
166-
}
147+
DataConnect.logger
148+
.debug("executeQuery() sends grpc request \(requestString, privacy: .private).")
167149
let results = try await client.executeQuery(grpcRequest, callOptions: createCallOptions())
168-
if debugEnable == true {
169-
try FirebaseLogger.dataConnect
170-
.debug("executeQuery() receives response: \(results.jsonString()).")
171-
} else {
172-
try FirebaseLogger.dataConnect
173-
.debug("executeQuery() receives response.")
174-
}
150+
let resultsString = try " " + results.jsonString()
151+
DataConnect.logger
152+
.debug("executeQuery() receives response: \(resultsString, privacy: .private).")
175153
// Not doing error decoding here
176154
if let decodedResults = try codec.decode(result: results.data, asType: resultType) {
177155
return OperationResult(data: decodedResults)
178156
} else {
179157
// In future, set this as error in OperationResult
180-
if debugEnable == true {
181-
try FirebaseLogger.dataConnect
182-
.error("executeQuery() response: \(results.jsonString()) decode failed.")
183-
} else {
184-
try FirebaseLogger.dataConnect
185-
.error("executeQuery() response decode failed.")
186-
}
158+
DataConnect.logger
159+
.debug("executeQuery() response\(resultsString, privacy: .private) decode failed.")
187160
throw DataConnectError.decodeFailed
188161
}
189162
} catch {
190-
if debugEnable == true {
191-
try FirebaseLogger.dataConnect
192-
.error(
193-
"executeQuery() with request: \(grpcRequest.jsonString()) grpc call FAILED with \(error)."
194-
)
195-
} else {
196-
try FirebaseLogger.dataConnect
197-
.error(
198-
"executeQuery() grpc call FAILED with \(error)."
199-
)
200-
}
163+
DataConnect.logger
164+
.error(
165+
"executeQuery()\(requestString, privacy: .private) grpc call FAILED with \(error)."
166+
)
201167
throw error
202168
}
203169
}
@@ -208,7 +174,7 @@ actor GrpcClient: CustomStringConvertible {
208174
.Type)
209175
async throws -> OperationResult<ResultType> {
210176
guard let client else {
211-
FirebaseLogger.dataConnect
177+
DataConnect.logger
212178
.error("When calling executeMutation(), grpc client has not been configured.")
213179
throw DataConnectError.grpcNotConfigured
214180
}
@@ -219,46 +185,27 @@ actor GrpcClient: CustomStringConvertible {
219185
request: request
220186
)
221187

188+
let requestString = try " " + grpcRequest.jsonString()
189+
222190
do {
223-
if debugEnable == true {
224-
try FirebaseLogger.dataConnect
225-
.debug("executeMutation() sends grpc request: \(grpcRequest.jsonString()).")
226-
} else {
227-
try FirebaseLogger.dataConnect
228-
.debug("executeMutation() sends grpc request.")
229-
}
191+
DataConnect.logger
192+
.debug("executeMutation() sends grpc request \(requestString, privacy: .private).")
230193
let results = try await client.executeMutation(grpcRequest, callOptions: createCallOptions())
231-
if debugEnable == true {
232-
try FirebaseLogger.dataConnect
233-
.debug("executeMutation() receives response: \(results.jsonString()).")
234-
} else {
235-
try FirebaseLogger.dataConnect
236-
.debug("executeMutation() receives response.")
237-
}
194+
let resultsString = try " " + results.jsonString()
195+
DataConnect.logger
196+
.debug("executeMutation() receives response: \(resultsString, privacy: .private).")
238197
if let decodedResults = try codec.decode(result: results.data, asType: resultType) {
239198
return OperationResult(data: decodedResults)
240199
} else {
241-
if debugEnable == true {
242-
try FirebaseLogger.dataConnect
243-
.error("executeMutation() response: \(results.jsonString()) decode failed.")
244-
} else {
245-
try FirebaseLogger.dataConnect
246-
.error("executeMutation() response decode failed.")
247-
}
200+
DataConnect.logger
201+
.debug("executeMutation() response\(resultsString, privacy: .private) decode failed.")
248202
throw DataConnectError.decodeFailed
249203
}
250204
} catch {
251-
if debugEnable == true {
252-
try FirebaseLogger.dataConnect
253-
.error(
254-
"executeMutation() with request: \(grpcRequest.jsonString()) grpc call FAILED with \(error)."
255-
)
256-
} else {
257-
try FirebaseLogger.dataConnect
258-
.error(
259-
"executeMutation() grpc call FAILED with \(error)."
260-
)
261-
}
205+
DataConnect.logger
206+
.error(
207+
"executeMutation()\(requestString, privacy: .private) grpc call FAILED with \(error)."
208+
)
262209
throw error
263210
}
264211
}
@@ -274,38 +221,28 @@ actor GrpcClient: CustomStringConvertible {
274221
do {
275222
if let token = try await auth.currentUser?.getIDToken() {
276223
headers.add(name: RequestHeaders.authorizationHeader, value: "\(token)")
277-
if debugEnable == true {
278-
FirebaseLogger.dataConnect
279-
.debug("Auth token added: \(token)")
280-
} else {
281-
FirebaseLogger.dataConnect
282-
.debug("Auth token added.")
283-
}
224+
DataConnect.logger
225+
.debug("Auth token added \(token, privacy: .private)")
284226
} else {
285-
FirebaseLogger.dataConnect.debug("No auth token available. Not adding auth header.")
227+
DataConnect.logger.debug("No auth token available. Not adding auth header.")
286228
}
287229
} catch {
288-
FirebaseLogger.dataConnect
230+
DataConnect.logger
289231
.debug("Cannot get auth token successfully due to: \(error). Not adding auth header.")
290232
}
291233

292234
// Add AppCheck token if available
293235
do {
294236
if let token = try await appCheck?.token(forcingRefresh: false) {
295237
headers.add(name: RequestHeaders.appCheckHeader, value: token.token)
296-
if debugEnable == true {
297-
FirebaseLogger.dataConnect
298-
.debug("App Check token added: \(token.token)")
299-
} else {
300-
FirebaseLogger.dataConnect
301-
.debug("App Check token added.")
302-
}
238+
DataConnect.logger
239+
.debug("App Check token added \(token.token)")
303240
} else {
304-
FirebaseLogger.dataConnect
241+
DataConnect.logger
305242
.debug("App Check token unavailable. Not adding App Check header.")
306243
}
307244
} catch {
308-
FirebaseLogger.dataConnect
245+
DataConnect.logger
309246
.debug(
310247
"Cannot get App Check token successfully due to: \(error). Not adding App Check header."
311248
)

0 commit comments

Comments
 (0)