Security & data
Security and your data
Written for whoever has been asked whether your customer data can live in Glovebox. It describes mechanisms rather than adjectives, and it names the things we have not built yet.
Summary
Glovebox is a rental management platform for vehicle hire operators. It holds bookings, customer records, payment history and fleet data. It is built and run by Dori Media, a New Zealand company, and it is a small team rather than a large one.
The honest one-line description of the architecture: Glovebox is a multi-tenant application on a single shared database, and one operator's data is kept separate from another's by the application, not by the storage engine. That is the most important sentence on this page, so it is also a section of its own.
We would rather you found the limits here than discovered them later. There is a list of what we do not have at the bottom, and it is not short.
Where your data lives
Operating data sits in one relational database. Uploaded files, including customer identity photos, go to object storage on a private bucket rather than to the web server's public directory.
Backups
The database is dumped on a schedule, not on request.
- A full backup runs every six hours, in the background, so a slow upload never blocks anything else.
- Dumps are compressed and written to object storage, which means offsite rather than on the application server.
- The 50 most recent backups are kept and older ones are pruned automatically. At a six-hourly cadence that is roughly 12.5 days of history.
- Every run reports its outcome as a signed heartbeat to a monitoring endpoint, so a backup that fails or silently stops is visible rather than discovered when it is needed.
We have not published a tested restore time, because we would only be guessing at one. If your procurement process needs a recovery time objective, ask and we will give you a real answer rather than an aspirational one.
Hosting and region
- Application and database: a DigitalOcean droplet in their Sydney region. The database runs on that same server rather than as a separate managed service, so your operating data is in Sydney.
- Uploads and backups: Cloudflare R2 object storage. R2 buckets are created with an automatic location rather than a region you pick, so we are not going to claim a country for uploaded files until we have confirmed where that bucket actually sits. If file residency matters to your procurement, ask us and we will confirm it before you sign anything.
That distinction is deliberate. It would be easy to write "hosted in Sydney" across the whole page and leave it there. Compute and database are in Sydney and we are happy to be held to it. Object storage we have not verified to the same standard, so we have said so rather than let one true statement cover for one we have not checked.
Keeping operators separate
This is the section that matters most, so it describes the mechanism precisely rather than reassuringly.
Glovebox runs on a shared database. Every record belonging to an operator carries that operator's workspace id, and separation is enforced in the application layer: a global query scope adds a workspace filter to every query against workspace-owned data, so a query made in one workspace returns only that workspace's rows.
It is worth being clear about what that is not. It is not physical separation, and it is not a separate database for each operator. Its correctness depends on the application applying the filter everywhere it should, which means it is guarded by tests rather than by the storage engine.
What we do about that, concretely:
- An automated cross-workspace isolation test runs over the workspace-owned models on every change, and asserts that a query made as one operator cannot see another's records.
- Entry points that can run outside a workspace context, such as payment webhooks, scheduled jobs and command line tooling, are the ones we treat as highest risk, because that is where the filter has to be applied deliberately rather than automatically.
- We have found and hardened specific paths of exactly that kind, including operator panel access on our central host and the machine-readable dashboard endpoint. We would rather tell you that we found them than claim the class of problem cannot occur.
Machine access is by per-workspace token. There is no platform-wide API key that spans workspaces.
Beyond database rows, cached data, queued background jobs and uploaded files are also partitioned per workspace.
Authentication and access
Your team
People you invite, and only within your workspace. Access is role-based, so staff do not automatically get owner-level reach. If someone belongs to more than one workspace they switch between them explicitly, and there is no view that spans workspaces. Reaching a workspace requires a verified email address.
Passwords and sessions
- Passwords are hashed with bcrypt. A password reset requires at least 12 characters. We do not impose mixed-case or symbol rules, because length is what actually helps.
- Sign-in is rate limited to 5 attempts a minute and 20 an hour per IP address.
- Session cookies are HTTP-only and same-site. Sessions expire after 30 days idle, and changing a password invalidates sessions on other devices.
Two-factor authentication
Two-factor authentication is not available today. We built it, then withdrew it before it was in general use, and the current release does not offer it to any account. We are not going to describe a control we do not have, so this section will stay here, saying this, until that changes.
Single sign-on
Not available. There is no SAML, no OIDC and no SCIM provisioning. Operators sign in with an email address and password.
Our access
Glovebox staff hold a separate platform administrator flag. It is deliberately not mass-assignable, meaning it cannot be granted by a submitted form or a stray field in a request, and it is set only through explicit paths in the code. It exists so we can support you, investigate a problem you have reported, and operate the platform.
Two accounts currently hold it, both belonging to the company's founder. Glovebox is a small operation and we would rather give you the number than describe it vaguely. Administrative actions are written to the same audit log as everything else.
Sign-in audit trail
Sign-ins, failed sign-ins, sign-outs and password resets are recorded with the email address, IP address, user agent, workspace and host. Those records are kept for 180 days and pruned automatically after that.
Payment data
Glovebox never receives a card number. Card details are entered directly into the payment provider's own hosted fields and go to the provider, not to us. There is no column anywhere in our database for a card number, a security code or a cardholder name.
What we do store, for each customer who has paid:
- The provider's customer and payment-method tokens, which are references, not card details. These are encrypted by the application before they are written.
- The provider's response payload for each transaction, also encrypted before it is written.
The masked "card ending 1234" an operator sees is read back out of that encrypted payload, or fetched from the provider when needed. There is no card number in our database to expose.
Bonds are authorisations held by the payment provider against the customer's card. Placing and releasing a bond does not cause us to store anything beyond what is described above.
We use two payment providers, Stripe and Windcave, depending on the operator. Both are established gateways that hold their own card data compliance. We make no PCI DSS claim of our own, because we hold no card data to make one about.
Personal information
Vehicle hire needs identity checks, so Glovebox holds driver licence photos and licence details. This is the most sensitive data on the platform and it is handled accordingly.
Identity photos
- Stored on private object storage under unguessable filenames. They are never placed in a publicly reachable directory and there is no public URL for them.
- Every upload is decoded and re-encoded to JPEG on the way in. That removes EXIF metadata, including any GPS coordinates the customer's phone attached, and it neutralises files that pretend to be images.
- Served only through an authorised endpoint that checks permission on each request, with caching disabled.
- Every view of an identity document is logged, recording which staff member opened it, for which customer and which booking.
- Automatically deleted 90 days after the hire ends, then permanently removed, file and record together, after a further 30 days. This runs daily, without anyone having to remember.
Licence details
Licence number, expiry, country and type are held as fields on the customer record. To be precise about the difference: the automatic deletion above covers the photos. Licence details recorded against a customer are retained for as long as that customer record exists, because operators need them for repeat hires and for their own legal obligations. An operator can delete a customer record.
Privacy Act 2020
Operators are the agency holding their customers' information, and Glovebox processes it on their behalf. Access and correction requests reach us by email and we action them with the operator. We do not have a self-service tool for this, so it is a person doing it, and we would rather say so.
Getting your data out
Your operating data is yours. Under our platform terms you can close your account at any time and export your data for 30 days afterwards.
Export today is handled by request through support rather than by a self-service button. We will provide bookings, customers and payment records as CSV within 3 business days of your request. Deleted data also persists in the rolling backups described above for roughly 12.5 days before ageing out.
Application security
Encryption at rest
Particularly sensitive fields are encrypted by the application before they are written, so they are unreadable in a database dump. That currently covers payment provider customer and payment-method tokens, stored gateway responses, accounting and calendar integration tokens, messaging provider credentials, vehicle lockbox codes, partner IRD numbers and bank account numbers, and partner vehicle insurance policy numbers.
To be precise about what sits underneath that: the database runs on standard cloud block storage. Our hosting provider encrypts storage at the physical layer, but that is their control rather than one we configure, hold a key for, or can demonstrate to you. We are not going to present it as a Glovebox control. Application-level field encryption, described above, is the one we actually operate.
Encryption in transit
Glovebox is served over HTTPS. Custom domains attached to an operator's booking site have their certificates issued and renewed automatically, and we track issuance until the domain is live.
File uploads
Customer-supplied images are restricted to a fixed list of image types, then fully decoded and re-encoded before storage rather than being written through as uploaded. Uploads are stored outside the web root and are never served from a path that could execute.
Testing and release
An automated test suite of roughly 4,400 tests runs against a production-equivalent database on every change, and the cross-workspace isolation sweep described above is part of it. Releases are deployed from version control, and every deployment is traceable to the exact commit it came from.
We are one small team, so we will be straightforward about the shape of that: we do not have the separation of duties a larger organisation would, and we do not currently run automated dependency vulnerability scanning. Both are on the list below.
Subprocessors
Third parties that may receive operator or customer data. Integrations marked optional receive nothing unless the operator connects them.
| Party | Purpose | Data it receives |
|---|---|---|
| Cloudflare R2 | Object storage for uploads and database backups | Identity photos, and database backups containing all operating data |
| DigitalOcean | Application and database hosting, Sydney | All operating data, as the server it runs on |
| Stripe | Card payments, bonds, payouts, platform billing | Customer name, email, card details entered directly with Stripe, booking amounts |
| Windcave | Card payments, alternative gateway | As Stripe |
| Postmark | Transactional email | Customer name, email address, booking details, email contents |
| Kudosity | SMS and WhatsApp messaging | Customer mobile number, message contents |
| ClickSend | SMS for time-critical operational alerts | Customer mobile number, message contents |
| Cloudflare | DNS, content delivery, certificates for custom domains | Web traffic in transit. No data stored at rest. |
| Laravel Forge | Server provisioning and deployment | Infrastructure access. No customer data by design. |
| Xero optional | Accounting sync, only if the operator connects it | Customer name, email, invoice lines, payment amounts |
| Google Calendar optional | Booking calendar sync, only if the operator connects it | Booking times, customer name, vehicle |
| Freelegs optional | Vehicle relocation partner integration | Relocation driver name, email, phone, licence number, vehicle and route details |
| Google reCAPTCHA | Spam protection on public forms | IP address and browser signals of form visitors |
| Google Analytics | Analytics on our own marketing site only | Visitors to getglovebox.co.nz. Not used on operator booking sites. |
Two more services are worth naming even though they are not on the table, because they receive no operator or customer data and we would rather you heard it from us than found them: a backup monitoring endpoint, which receives only whether each backup run succeeded, and a push notification service that tells us when someone opens the public demo, which receives anonymous visitor telemetry from our own marketing site.
We will tell you where each of these processes data, and give you notice of additions, on request.
Reporting a vulnerability
If you think you have found a security problem in Glovebox, email hello@getglovebox.co.nz with enough detail to reproduce it. That inbox is monitored by the people who can act on it.
We will acknowledge your report and keep you informed while we work on it. We are deliberately not publishing a guaranteed response time here, because we are a small team and we would rather not print a number we might miss.
If you are reporting in good faith, we will not pursue you. We ask that you give us a reasonable chance to fix the issue before disclosing it publicly, that you do not access or modify data belonging to anyone other than yourself, and that you do not degrade the service for operators. We do not run a paid bounty programme.
What we do not have yet
Named plainly, without dates, because a page that hides its gaps is only credible until the reviewer finds one.
- Two-factor authentication. Not available on any account.
- Single sign-on. No SAML, no OIDC, no SCIM provisioning.
- A database per operator. Separation is enforced by the application on a shared database, as described above.
- Formal certification. We are not SOC 2 audited and not ISO 27001 certified, and we hold no PCI DSS attestation of our own.
- An independent penetration test. None has been carried out. If one had, this page would name who did it and when.
- Automated dependency vulnerability scanning. Not currently configured.
- Self-service data export. Export is by request through support.
- A published recovery time objective. Backups run and are monitored; a tested restore time is not something we have measured and published.
Questions about any of this? Get in touch, or email hello@getglovebox.co.nz. If you are working through a procurement questionnaire, send it over and we will answer it directly rather than pointing you back at this page.