@shahadpichen/docpush 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -13
- package/dist/server/auth/oauth.d.ts.map +1 -1
- package/dist/server/auth/oauth.js +4 -16
- package/dist/server/auth/oauth.js.map +1 -1
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/middleware/auth.js +14 -1
- package/dist/server/middleware/auth.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Self-hosted, Git-backed collaborative documentation platform.
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- 📝 **Git-backed** - All docs stored in your GitHub repo
|
|
8
|
-
- 🔐 **Flexible Auth** - Public
|
|
8
|
+
- 🔐 **Flexible Auth** - Public or OAuth with domain restriction
|
|
9
9
|
- ✏️ **Draft System** - Branch-based editing with approval workflow
|
|
10
10
|
- 💬 **Comments** - Collaborative review process
|
|
11
11
|
- ⚛️ **React Components** - Headless UI components for your app
|
|
@@ -70,25 +70,21 @@ auth: {
|
|
|
70
70
|
|
|
71
71
|
### Domain-Restricted Mode
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
OAuth login (Google/GitHub) with email domain verification.
|
|
74
74
|
|
|
75
75
|
```javascript
|
|
76
76
|
auth: {
|
|
77
77
|
mode: 'domain-restricted',
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
providers: ['google'], // or ['github']
|
|
79
|
+
allowedDomains: ['yourcompany.com'],
|
|
80
80
|
}
|
|
81
81
|
```
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
**Required env vars for domain-restricted:**
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
auth: {
|
|
89
|
-
mode: 'oauth',
|
|
90
|
-
providers: ['github', 'google'],
|
|
91
|
-
}
|
|
85
|
+
```
|
|
86
|
+
GOOGLE_CLIENT_ID=your_client_id
|
|
87
|
+
GOOGLE_CLIENT_SECRET=your_client_secret
|
|
92
88
|
```
|
|
93
89
|
|
|
94
90
|
## React Components
|
|
@@ -103,7 +99,7 @@ import {
|
|
|
103
99
|
MarkdownEditor,
|
|
104
100
|
useDocs,
|
|
105
101
|
useDrafts,
|
|
106
|
-
} from "docpush/react";
|
|
102
|
+
} from "@shahadpichen/docpush/react";
|
|
107
103
|
|
|
108
104
|
function App() {
|
|
109
105
|
return (
|
|
@@ -114,6 +110,15 @@ function App() {
|
|
|
114
110
|
}
|
|
115
111
|
```
|
|
116
112
|
|
|
113
|
+
## Add Components (shadcn-style)
|
|
114
|
+
|
|
115
|
+
Copy components to your project for customization:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npx @shahadpichen/docpush add button input textarea
|
|
119
|
+
npx @shahadpichen/docpush add all
|
|
120
|
+
```
|
|
121
|
+
|
|
117
122
|
## API Endpoints
|
|
118
123
|
|
|
119
124
|
| Endpoint | Description |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/server/auth/oauth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWpD;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/server/auth/oauth.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWpD;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,QA8F5C"}
|
|
@@ -13,8 +13,6 @@ const passport_google_oauth20_1 = require("passport-google-oauth20");
|
|
|
13
13
|
function setupOAuth(config) {
|
|
14
14
|
if (config.auth.mode !== 'domain-restricted')
|
|
15
15
|
return;
|
|
16
|
-
// Get allowed domains from config (required for domain-restricted)
|
|
17
|
-
const allowedDomains = config.auth.allowedDomains;
|
|
18
16
|
// GitHub OAuth
|
|
19
17
|
if (config.auth.providers.includes('github') &&
|
|
20
18
|
process.env.GITHUB_CLIENT_ID &&
|
|
@@ -27,13 +25,8 @@ function setupOAuth(config) {
|
|
|
27
25
|
}, async (accessToken, refreshToken, profile, done) => {
|
|
28
26
|
try {
|
|
29
27
|
const email = profile.emails?.[0]?.value || `${profile.username}@github.com`;
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
const domain = email.split('@')[1];
|
|
33
|
-
if (!allowedDomains.includes(domain)) {
|
|
34
|
-
return done(null, false);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
28
|
+
// Domain check happens in requireEdit middleware, not here
|
|
29
|
+
// This allows anyone to login, but only allowed domains can edit
|
|
37
30
|
const user = {
|
|
38
31
|
id: `github:${profile.id}`,
|
|
39
32
|
email,
|
|
@@ -64,13 +57,8 @@ function setupOAuth(config) {
|
|
|
64
57
|
if (!email) {
|
|
65
58
|
return done(null, false);
|
|
66
59
|
}
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
const domain = email.split('@')[1];
|
|
70
|
-
if (!allowedDomains.includes(domain)) {
|
|
71
|
-
return done(null, false);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
60
|
+
// Domain check happens in requireEdit middleware, not here
|
|
61
|
+
// This allows anyone to login, but only allowed domains can edit
|
|
74
62
|
const user = {
|
|
75
63
|
id: `google:${profile.id}`,
|
|
76
64
|
email,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/server/auth/oauth.ts"],"names":[],"mappings":";;;;;AAiBA,
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/server/auth/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI/D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,IAAI;YACZ,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf;KACF;CACF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI/D,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,IAAI;YACZ,EAAE,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,IAAI,CAAC,EAAE,MAAM,CAAC;SACf;KACF;CACF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhG;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BjG"}
|
|
@@ -13,11 +13,24 @@ async function requireEdit(req, res, next) {
|
|
|
13
13
|
req.user = { id: 'anonymous', email: null, role: 'editor' };
|
|
14
14
|
return next();
|
|
15
15
|
}
|
|
16
|
-
// Domain-restricted
|
|
16
|
+
// Domain-restricted - must be logged in
|
|
17
17
|
if (!req.user) {
|
|
18
18
|
res.status(401).json({ error: 'Authentication required' });
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
|
+
// For domain-restricted mode, check if user's email domain is allowed
|
|
22
|
+
if (config.auth.mode === 'domain-restricted') {
|
|
23
|
+
const userEmail = req.user.email;
|
|
24
|
+
if (!userEmail) {
|
|
25
|
+
res.status(403).json({ error: 'Email required for editing' });
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const domain = userEmail.split('@')[1];
|
|
29
|
+
if (!config.auth.allowedDomains.includes(domain)) {
|
|
30
|
+
res.status(403).json({ error: `Your email domain @${domain} is not allowed to edit` });
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
21
34
|
next();
|
|
22
35
|
}
|
|
23
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":";;AAkBA,
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"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"}
|