---
title: "Security"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Security}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(message = FALSE, warning = FALSE)
```

```{r}
library(TextAnalysisR)

mydata <- SpecialEduTech[seq_len(5), c("title", "abstract")]
united <- unite_cols(mydata, listed_vars = c("title", "abstract"))
toks   <- prep_texts(united, text_field = "united_texts")
quanteda::ndoc(toks)
```

TextAnalysisR includes built-in security features.

## Input Validation

| Feature | Description |
|---------|-------------|
| File uploads | Extension whitelist, 50MB limit, malicious content scanning |
| Text and LLM inputs | XSS and prompt injection filtering |
| Column names | Regex validation to prevent formula injection |

## API Key Security

- Stored via `.env` or environment variables (never logged or persisted)
- Masked input field with format validation
- Transmitted via secure headers only

**Environment Variable:** add `OPENAI_API_KEY=...` to `.Renviron`, or set in-session:

```{r, eval = FALSE}
Sys.setenv(OPENAI_API_KEY = "sk-...")
```

## Network Security

- Content Security Policy, X-Frame-Options, SRI for CDN resources
- HTTPS with TLS 1.2+ via Nginx/Cloudflare

## Data Protection

- Session-scoped with no persistent storage, cookies, or identifiers
- Rate limiting: 100 requests/hour per session
- Security event logging with sanitized error messages
- Local processing option (FERPA/HIPAA compatible)

## Infrastructure

- Cloudflare DNS with DDoS protection
- Docker + Nginx deployment
