diff --git a/.github/ISSUE_TEMPLATE/improvement.yml b/.github/ISSUE_TEMPLATE/improvement.yml
index 058a025e7..de2983b67 100644
--- a/.github/ISSUE_TEMPLATE/improvement.yml
+++ b/.github/ISSUE_TEMPLATE/improvement.yml
@@ -1,35 +1,39 @@
-name: 'General Improvement'
-description: Suggest a minor enhancement or improvement for this project
+name: 'General Improvement Request'
+description: 'Suggest a minor enhancement or improvement for this project'
+title: '[Title for your improvement suggestion]'
body:
- - type: markdown
- attributes:
- value: Please provide a clear and concise title for your improvement suggestion
- type: textarea
attributes:
- label: Improvement Description
- description: Describe the improvement you are suggesting in detail. Explain what specific aspect of the project it addresses or enhances.
+ label: 'Describe the improvement you are suggesting in detail'
+ description: 'Explain why this improvement would be beneficial. Share any context, pain points, or reasons for suggesting this change.'
+ validations:
+ required: true
- type: textarea
+ id: description
attributes:
- label: Rationale
- description: Explain why this improvement would be beneficial. Share any context, pain points, or reasons for suggesting this change.
- - type: textarea
+ label: 'Additional Information & Alternatives (optional)'
+ description: 'Are there any additional context or information that might be relevant to the improvement suggestion.'
+ validations:
+ required: false
+ - type: dropdown
+ id: assignee
attributes:
- label: Proposed Solution
- description: If you have a suggestion for how this improvement could be implemented, describe it here. Include any technical details, design suggestions, or other relevant information.
- - type: textarea
- attributes:
- label: Alternatives (optional)
- description: Are there any alternative approaches to achieve the same improvement? Describe other ways to address the issue or enhance the project.
- - type: textarea
- attributes:
- label: Additional Context
- description: Add any additional context or information that might be relevant to the improvement suggestion.
+ label: 'Do you want to work on this improvement?'
+ multiple: false
+ options:
+ - 'No'
+ - 'Yes'
+ default: 0
+ validations:
+ required: true
- type: checkboxes
attributes:
- label: Please check the boxes that apply to this improvement suggestion.
+ label: 'Please check the boxes that apply to this improvement suggestion.'
options:
- - label: I have searched the existing issues and improvement suggestions to avoid duplication.
- - label: I have provided a clear description of the improvement being suggested.
- - label: I have explained the rationale behind this improvement.
- - label: I have included any relevant technical details or design suggestions.
- - label: I understand that this is a suggestion and that there is no guarantee of implementation.
+ - label: 'I have searched the existing issues and improvement suggestions to avoid duplication.'
+ - label: 'I have provided a clear description of the improvement being suggested.'
+ - label: 'I have explained the rationale behind this improvement.'
+ - label: 'I have included any relevant technical details or design suggestions.'
+ - label: 'I understand that this is a suggestion and that there is no guarantee of implementation.'
+ validations:
+ required: true
diff --git a/README.md b/README.md
index 39cbb4332..6d2fab334 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+>We are nominated for a Product Hunt Gold Kitty 😺✨ and appreciate any support: https://documen.so/kitty
+
diff --git a/apps/marketing/content/blog/email-provider-incident-2024-01-10.mdx b/apps/marketing/content/blog/email-provider-incident-2024-01-10.mdx
new file mode 100644
index 000000000..0f5279d6e
--- /dev/null
+++ b/apps/marketing/content/blog/email-provider-incident-2024-01-10.mdx
@@ -0,0 +1,28 @@
+---
+title: Jan 10th Email Provider Security Incident
+description: On January 10th, 2022, we were notified by our email provider that they had experienced a security incident.
+authorName: 'Lucas Smith'
+authorImage: '/blog/blog-author-lucas.png'
+authorRole: 'Co-Founder'
+date: 2024-01-17
+tags:
+ - Security
+---
+
+On January 10th, 2024 we were notified by our email provider that a security incident had occurred. This security incident which had started on January 7th led to a bad actor obtaining access to their database which contains ours and other customer’s data.
+
+We understand that during this security incident the following has been accessed:
+
+- Email addresses.
+- Metadata on emails sent excluding the email body.
+
+While the incident is unfortunate we are pleased with the remediation and the processes that our email provider has put in place to help avoid this kind of situation in the future. Since the incident, our provider has rectified the issue and has engaged a security company to conduct an exhaustive investigation and to help improve their security posture moving forward.
+
+We remain steadfast in our commitment to our current email provider, and will not be taking any further action with relation to changing providers.
+
+We are now working with our legal counsel to ensure that we provide the appropriate notice to all our customers in each jurisdiction. If you have any further questions on this incident please feel free to contact our support team at [support@documenso.com](mailto:support@documenso.com).
+
+We appreciate your ongoing support in this matter.
+
+You can read more on the incident on our providers blog post below:
+[https://resend.com/blog/incident-report-for-january-10-2024](https://resend.com/blog/incident-report-for-january-10-2024)
diff --git a/apps/marketing/content/blog/pre-seed.mdx b/apps/marketing/content/blog/pre-seed.mdx
index fae0a6c4a..215700355 100644
--- a/apps/marketing/content/blog/pre-seed.mdx
+++ b/apps/marketing/content/blog/pre-seed.mdx
@@ -1,6 +1,6 @@
---
title: Announcing Pre-Seed and Open Metrics
-description: We are exicited to report the closing of our Pre-Seed round. You can find the juicy details on our new /open page. Yes, it was signed using Documenso.
+description: We are excited to report the closing of our Pre-Seed round. You can find the juicy details on our new /open page. Yes, it was signed using Documenso.
authorName: 'Timur Ercan'
authorImage: '/blog/blog-author-timur.jpeg'
authorRole: 'Co-Founder'
diff --git a/apps/marketing/content/blog/shop.mdx b/apps/marketing/content/blog/shop.mdx
index fafd98a40..cb5b65554 100644
--- a/apps/marketing/content/blog/shop.mdx
+++ b/apps/marketing/content/blog/shop.mdx
@@ -30,7 +30,7 @@ We kicked off [Malfunction Mania](https://documenso.com/blog/malfunction-mania)
## Documenso Merch Shop
-The shirt will be available in our [merch shop](https://documen.so/shop) via a unique discount code. While the shirt will be gone after Malfunction Mania, the shop is here to stay and provide a well-deserved reward for great community members and contributors. All items can be earned by contrinuting to Documenso.
+The shirt will be available in our [merch shop](https://documen.so/shop) via a unique discount code. While the shirt will be gone after Malfunction Mania, the shop is here to stay and provide a well-deserved reward for great community members and contributors. All items can be earned by contributing to Documenso.
{
@@ -56,6 +58,8 @@ export const EditDocumentForm = ({
const { mutateAsync: addFields } = trpc.field.addFields.useMutation();
const { mutateAsync: addSigners } = trpc.recipient.addSigners.useMutation();
const { mutateAsync: sendDocument } = trpc.document.sendDocument.useMutation();
+ const { mutateAsync: setPasswordForDocument } =
+ trpc.document.setPasswordForDocument.useMutation();
const documentFlow: Record = {
title: {
@@ -176,6 +180,13 @@ export const EditDocumentForm = ({
}
};
+ const onPasswordSubmit = async (password: string) => {
+ await setPasswordForDocument({
+ documentId: document.id,
+ password,
+ });
+ };
+
const currentDocumentFlow = documentFlow[step];
return (
@@ -185,7 +196,13 @@ export const EditDocumentForm = ({
gradient
>
-
+
diff --git a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx
index b26b6308c..44f3991d8 100644
--- a/apps/web/src/app/(dashboard)/documents/[id]/page.tsx
+++ b/apps/web/src/app/(dashboard)/documents/[id]/page.tsx
@@ -3,10 +3,12 @@ import { redirect } from 'next/navigation';
import { ChevronLeft, Users2 } from 'lucide-react';
+import { DOCUMENSO_ENCRYPTION_KEY } from '@documenso/lib/constants/crypto';
import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get-server-component-session';
import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id';
import { getFieldsForDocument } from '@documenso/lib/server-only/field/get-fields-for-document';
import { getRecipientsForDocument } from '@documenso/lib/server-only/recipient/get-recipients-for-document';
+import { symmetricDecrypt } from '@documenso/lib/universal/crypto';
import { DocumentStatus as InternalDocumentStatus } from '@documenso/prisma/client';
import { LazyPDFViewer } from '@documenso/ui/primitives/lazy-pdf-viewer';
@@ -40,7 +42,24 @@ export default async function DocumentPage({ params }: DocumentPageProps) {
redirect('/documents');
}
- const { documentData } = document;
+ const { documentData, documentMeta } = document;
+
+ if (documentMeta?.password) {
+ const key = DOCUMENSO_ENCRYPTION_KEY;
+
+ if (!key) {
+ throw new Error('Missing DOCUMENSO_ENCRYPTION_KEY');
+ }
+
+ const securePassword = Buffer.from(
+ symmetricDecrypt({
+ key,
+ data: documentMeta.password,
+ }),
+ ).toString('utf-8');
+
+ documentMeta.password = securePassword;
+ }
const [recipients, fields] = await Promise.all([
getRecipientsForDocument({
@@ -83,6 +102,7 @@ export default async function DocumentPage({ params }: DocumentPageProps) {
className="mt-8"
document={document}
user={user}
+ documentMeta={documentMeta}
recipients={recipients}
fields={fields}
documentData={documentData}
@@ -91,7 +111,12 @@ export default async function DocumentPage({ params }: DocumentPageProps) {
{document.status === InternalDocumentStatus.COMPLETED && (