created uv project structure, added Docker integration, updated README.md with some general info
This commit is contained in:
commit
4dd522697f
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# Python-generated files
|
||||
__pycache__/
|
||||
*.py[oc]
|
||||
build/
|
||||
dist/
|
||||
wheels/
|
||||
*.egg-info
|
||||
|
||||
# Virtual environments
|
||||
.venv
|
1
.python-version
Normal file
1
.python-version
Normal file
@ -0,0 +1 @@
|
||||
3.12
|
7
Dockerfile
Normal file
7
Dockerfile
Normal file
@ -0,0 +1,7 @@
|
||||
FROM python:3.12-slim-bookworm
|
||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
||||
ADD . /app
|
||||
WORKDIR /app
|
||||
RUN uv sync --frozen
|
||||
EXPOSE 8000
|
||||
CMD ["uv", "run", "fastapi", "dev", "main.py", "--host", "0.0.0.0"]
|
18
README.md
Normal file
18
README.md
Normal file
@ -0,0 +1,18 @@
|
||||
# autodiscover-proxy
|
||||
|
||||
A simple proxy server used to expose domains associated with a given domain via Microsoft's AutoDiscover.svc.
|
||||
|
||||
## Usage
|
||||
|
||||
Running locally:
|
||||
```bash
|
||||
uv run fastapi dev main.py
|
||||
```
|
||||
|
||||
Running in Docker:
|
||||
```bash
|
||||
docker run -p 8000:8000 -it git.wnd.sh/n/autodiscover-proxy
|
||||
# or
|
||||
docker build -t autodiscover-proxy .
|
||||
docker run -p 8000:8000 -it autodiscover-proxy
|
||||
```
|
50
main.py
Normal file
50
main.py
Normal file
@ -0,0 +1,50 @@
|
||||
from typing import Annotated
|
||||
from fastapi import FastAPI, Query
|
||||
from fastapi.responses import JSONResponse
|
||||
import xml.etree.ElementTree as xml
|
||||
import requests
|
||||
import json
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@app.get("/{domain}")
|
||||
def read_root(
|
||||
domain: str,
|
||||
platform: Annotated[
|
||||
str | None,
|
||||
Query(pattern="^default|gcc|gcc_high$")
|
||||
] = "default",
|
||||
):
|
||||
|
||||
match platform:
|
||||
case "gcc_high": base_uri = "autodiscover-s.office365.us"
|
||||
case "gcc": base_uri = "autodiscover-s-dod.office365.us"
|
||||
case "default": base_uri = "autodiscover-s.outlook.com"
|
||||
|
||||
headers = { "Content-Type": "text/xml; charset=utf-8", "SOAPAction": "http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformation" }
|
||||
uri = f"https://{base_uri}/autodiscover/autodiscover.svc"
|
||||
data = f"""<?xml version="1.0" encoding="utf-8"?>
|
||||
<soap:Envelope xmlns:exm="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:ext="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<soap:Header>
|
||||
<a:Action soap:mustUnderstand="1">http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformation</a:Action>
|
||||
<a:To soap:mustUnderstand="1">{uri}</a:To>
|
||||
<a:ReplyTo><a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address></a:ReplyTo>
|
||||
</soap:Header>
|
||||
<soap:Body>
|
||||
<GetFederationInformationRequestMessage xmlns="http://schemas.microsoft.com/exchange/2010/Autodiscover">
|
||||
<Request>
|
||||
<Domain>{domain}</Domain>
|
||||
</Request>
|
||||
</GetFederationInformationRequestMessage>
|
||||
</soap:Body>
|
||||
</soap:Envelope>
|
||||
"""
|
||||
|
||||
response = requests.post(uri, data=data, headers=headers)
|
||||
if (not response.ok): return { "error": f"Error contacting autodiscover service for {domain}" }
|
||||
|
||||
root = xml.fromstring(response.text)
|
||||
content = [i.text for i in root[1][0][0][3]] # root/body/GetFederationInformationResponseMessage/Domains
|
||||
|
||||
return JSONResponse(content=content, headers={"Cache-Control": "max-age=604800, public"})
|
||||
|
7
pyproject.toml
Normal file
7
pyproject.toml
Normal file
@ -0,0 +1,7 @@
|
||||
[project]
|
||||
name = "autodiscover-proxy"
|
||||
version = "0.1.0"
|
||||
description = "A simple proxy server used to expose domains associated with a given domain via Microsoft's AutoDiscover.svc."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.12"
|
||||
dependencies = ['fastapi[standard]', 'requests']
|
Loading…
x
Reference in New Issue
Block a user