mirror of
https://github.com/penpot/penpot.git
synced 2025-03-11 23:31:21 -05:00
✨ Improve ip-addr parsing
This commit is contained in:
parent
08c8c47006
commit
343f3feed3
6 changed files with 54 additions and 25 deletions
|
@ -26,6 +26,7 @@
|
||||||
[app.rpc.commands.profile :as profile]
|
[app.rpc.commands.profile :as profile]
|
||||||
[app.setup :as-alias setup]
|
[app.setup :as-alias setup]
|
||||||
[app.tokens :as tokens]
|
[app.tokens :as tokens]
|
||||||
|
[app.util.inet :as inet]
|
||||||
[app.util.json :as json]
|
[app.util.json :as json]
|
||||||
[app.util.time :as dt]
|
[app.util.time :as dt]
|
||||||
[buddy.sign.jwk :as jwk]
|
[buddy.sign.jwk :as jwk]
|
||||||
|
@ -574,7 +575,7 @@
|
||||||
(audit/submit! cfg {::audit/type "command"
|
(audit/submit! cfg {::audit/type "command"
|
||||||
::audit/name "login-with-oidc"
|
::audit/name "login-with-oidc"
|
||||||
::audit/profile-id (:id profile)
|
::audit/profile-id (:id profile)
|
||||||
::audit/ip-addr (audit/parse-client-ip request)
|
::audit/ip-addr (inet/parse-request request)
|
||||||
::audit/props props
|
::audit/props props
|
||||||
::audit/context context})
|
::audit/context context})
|
||||||
|
|
||||||
|
|
|
@ -21,28 +21,18 @@
|
||||||
[app.rpc :as-alias rpc]
|
[app.rpc :as-alias rpc]
|
||||||
[app.rpc.retry :as rtry]
|
[app.rpc.retry :as rtry]
|
||||||
[app.setup :as-alias setup]
|
[app.setup :as-alias setup]
|
||||||
|
[app.util.inet :as inet]
|
||||||
[app.util.services :as-alias sv]
|
[app.util.services :as-alias sv]
|
||||||
[app.util.time :as dt]
|
[app.util.time :as dt]
|
||||||
[app.worker :as wrk]
|
[app.worker :as wrk]
|
||||||
[clojure.spec.alpha :as s]
|
[clojure.spec.alpha :as s]
|
||||||
[cuerdas.core :as str]
|
[cuerdas.core :as str]
|
||||||
[integrant.core :as ig]
|
[integrant.core :as ig]))
|
||||||
[ring.request :as rreq]))
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; HELPERS
|
;; HELPERS
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(defn parse-client-ip
|
|
||||||
[request]
|
|
||||||
(let [ip-addr (or (some-> (rreq/get-header request "x-forwarded-for") (str/split ",") first)
|
|
||||||
(rreq/get-header request "x-real-ip")
|
|
||||||
(some-> (rreq/remote-addr request) str))
|
|
||||||
ip-addr (-> ip-addr
|
|
||||||
(str/split ":" 2)
|
|
||||||
(first))]
|
|
||||||
ip-addr))
|
|
||||||
|
|
||||||
(defn extract-utm-params
|
(defn extract-utm-params
|
||||||
"Extracts additional data from params and namespace them under
|
"Extracts additional data from params and namespace them under
|
||||||
`penpot` ns."
|
`penpot` ns."
|
||||||
|
@ -100,7 +90,6 @@
|
||||||
|
|
||||||
;; --- SPECS
|
;; --- SPECS
|
||||||
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;; COLLECTOR
|
;; COLLECTOR
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
@ -167,14 +156,16 @@
|
||||||
(assoc :external-session-id session-id)
|
(assoc :external-session-id session-id)
|
||||||
(assoc :external-event-origin event-origin)
|
(assoc :external-event-origin event-origin)
|
||||||
(assoc :access-token-id (some-> token-id str))
|
(assoc :access-token-id (some-> token-id str))
|
||||||
(d/without-nils))]
|
(d/without-nils))
|
||||||
|
|
||||||
|
ip-addr (inet/parse-request request)]
|
||||||
|
|
||||||
{::type (or (::type resultm)
|
{::type (or (::type resultm)
|
||||||
(::rpc/type cfg))
|
(::rpc/type cfg))
|
||||||
::name (or (::name resultm)
|
::name (or (::name resultm)
|
||||||
(::sv/name mdata))
|
(::sv/name mdata))
|
||||||
::profile-id profile-id
|
::profile-id profile-id
|
||||||
::ip-addr (some-> request parse-client-ip)
|
::ip-addr ip-addr
|
||||||
::props props
|
::props props
|
||||||
::context context
|
::context context
|
||||||
|
|
||||||
|
@ -202,7 +193,7 @@
|
||||||
:name (::name event)
|
:name (::name event)
|
||||||
:type (::type event)
|
:type (::type event)
|
||||||
:profile-id (::profile-id event)
|
:profile-id (::profile-id event)
|
||||||
:ip-addr (::ip-addr event "0.0.0.0")
|
:ip-addr (::ip-addr event)
|
||||||
:context (::context event {})
|
:context (::context event {})
|
||||||
:props (::props event {})
|
:props (::props event {})
|
||||||
:source "backend"}
|
:source "backend"}
|
||||||
|
@ -246,8 +237,7 @@
|
||||||
(assoc :created-at tnow)
|
(assoc :created-at tnow)
|
||||||
(update :tracked-at #(or % tnow))
|
(update :tracked-at #(or % tnow))
|
||||||
(assoc :props {})
|
(assoc :props {})
|
||||||
(assoc :context {})
|
(assoc :context {}))]
|
||||||
(assoc :ip-addr "0.0.0.0"))]
|
|
||||||
(append-audit-entry! cfg params)))
|
(append-audit-entry! cfg params)))
|
||||||
|
|
||||||
(when (and (contains? cf/flags :webhooks)
|
(when (and (contains? cf/flags :webhooks)
|
||||||
|
|
|
@ -14,11 +14,12 @@
|
||||||
[app.config :as cf]
|
[app.config :as cf]
|
||||||
[app.db :as db]
|
[app.db :as db]
|
||||||
[app.http :as-alias http]
|
[app.http :as-alias http]
|
||||||
[app.loggers.audit :as audit]
|
[app.loggers.audit :as-alias audit]
|
||||||
[app.rpc :as-alias rpc]
|
[app.rpc :as-alias rpc]
|
||||||
[app.rpc.climit :as-alias climit]
|
[app.rpc.climit :as-alias climit]
|
||||||
[app.rpc.doc :as-alias doc]
|
[app.rpc.doc :as-alias doc]
|
||||||
[app.rpc.helpers :as rph]
|
[app.rpc.helpers :as rph]
|
||||||
|
[app.util.inet :as inet]
|
||||||
[app.util.services :as sv]
|
[app.util.services :as sv]
|
||||||
[app.util.time :as dt]))
|
[app.util.time :as dt]))
|
||||||
|
|
||||||
|
@ -61,7 +62,7 @@
|
||||||
(defn- handle-events
|
(defn- handle-events
|
||||||
[{:keys [::db/pool]} {:keys [::rpc/profile-id events] :as params}]
|
[{:keys [::db/pool]} {:keys [::rpc/profile-id events] :as params}]
|
||||||
(let [request (-> params meta ::http/request)
|
(let [request (-> params meta ::http/request)
|
||||||
ip-addr (audit/parse-client-ip request)
|
ip-addr (inet/parse-request request)
|
||||||
tnow (dt/now)
|
tnow (dt/now)
|
||||||
xform (comp
|
xform (comp
|
||||||
(map (fn [event]
|
(map (fn [event]
|
||||||
|
|
|
@ -51,12 +51,12 @@
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
[app.config :as cf]
|
[app.config :as cf]
|
||||||
[app.http :as-alias http]
|
[app.http :as-alias http]
|
||||||
[app.loggers.audit :refer [parse-client-ip]]
|
|
||||||
[app.redis :as rds]
|
[app.redis :as rds]
|
||||||
[app.redis.script :as-alias rscript]
|
[app.redis.script :as-alias rscript]
|
||||||
[app.rpc :as-alias rpc]
|
[app.rpc :as-alias rpc]
|
||||||
[app.rpc.helpers :as rph]
|
[app.rpc.helpers :as rph]
|
||||||
[app.rpc.rlimit.result :as-alias lresult]
|
[app.rpc.rlimit.result :as-alias lresult]
|
||||||
|
[app.util.inet :as inet]
|
||||||
[app.util.services :as-alias sv]
|
[app.util.services :as-alias sv]
|
||||||
[app.util.time :as dt]
|
[app.util.time :as dt]
|
||||||
[app.worker :as wrk]
|
[app.worker :as wrk]
|
||||||
|
@ -215,7 +215,7 @@
|
||||||
[{:keys [::rpc/profile-id] :as params}]
|
[{:keys [::rpc/profile-id] :as params}]
|
||||||
(let [request (-> params meta ::http/request)]
|
(let [request (-> params meta ::http/request)]
|
||||||
(or profile-id
|
(or profile-id
|
||||||
(some-> request parse-client-ip)
|
(some-> request inet/parse-request)
|
||||||
uuid/zero)))
|
uuid/zero)))
|
||||||
|
|
||||||
(defn process-request!
|
(defn process-request!
|
||||||
|
|
37
backend/src/app/util/inet.clj
Normal file
37
backend/src/app/util/inet.clj
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
;;
|
||||||
|
;; Copyright (c) KALEIDOS INC
|
||||||
|
|
||||||
|
(ns app.util.inet
|
||||||
|
"INET addr parsing and validation helpers"
|
||||||
|
(:require
|
||||||
|
[cuerdas.core :as str]
|
||||||
|
[ring.request :as rreq])
|
||||||
|
(:import
|
||||||
|
com.google.common.net.InetAddresses
|
||||||
|
java.net.InetAddress))
|
||||||
|
|
||||||
|
(defn valid?
|
||||||
|
[s]
|
||||||
|
(InetAddresses/isInetAddress s))
|
||||||
|
|
||||||
|
(defn normalize
|
||||||
|
[s]
|
||||||
|
(try
|
||||||
|
(let [addr (InetAddresses/forString s)]
|
||||||
|
(.getHostAddress ^InetAddress addr))
|
||||||
|
(catch Throwable _cause
|
||||||
|
nil)))
|
||||||
|
|
||||||
|
(defn parse-request
|
||||||
|
[request]
|
||||||
|
(or (some-> (rreq/get-header request "x-real-ip")
|
||||||
|
(normalize))
|
||||||
|
(some-> (rreq/get-header request "x-forwarded-for")
|
||||||
|
(str/split #"\s*,\s*")
|
||||||
|
(first)
|
||||||
|
(normalize))
|
||||||
|
(some-> (rreq/remote-addr request)
|
||||||
|
(normalize))))
|
|
@ -11,7 +11,7 @@
|
||||||
[app.common.logging :as l]
|
[app.common.logging :as l]
|
||||||
[app.common.transit :as t]
|
[app.common.transit :as t]
|
||||||
[app.common.uuid :as uuid]
|
[app.common.uuid :as uuid]
|
||||||
[app.loggers.audit :refer [parse-client-ip]]
|
[app.util.inet :as inet]
|
||||||
[app.util.time :as dt]
|
[app.util.time :as dt]
|
||||||
[promesa.exec :as px]
|
[promesa.exec :as px]
|
||||||
[promesa.exec.csp :as sp]
|
[promesa.exec.csp :as sp]
|
||||||
|
@ -84,7 +84,7 @@
|
||||||
output-ch (sp/chan :buf output-buff-size)
|
output-ch (sp/chan :buf output-buff-size)
|
||||||
hbeat-ch (sp/chan :buf (sp/sliding-buffer 6))
|
hbeat-ch (sp/chan :buf (sp/sliding-buffer 6))
|
||||||
close-ch (sp/chan)
|
close-ch (sp/chan)
|
||||||
ip-addr (parse-client-ip request)
|
ip-addr (inet/parse-request request)
|
||||||
uagent (rreq/get-header request "user-agent")
|
uagent (rreq/get-header request "user-agent")
|
||||||
id (uuid/next)
|
id (uuid/next)
|
||||||
state (atom {})
|
state (atom {})
|
||||||
|
|
Loading…
Add table
Reference in a new issue