瀏覽代碼

Merge pull request #19 from babolivier/development

Development
Brendan Abolivier 6 年之前
父節點
當前提交
3610d72c8f
沒有帳戶連結到提交者的電子郵件
共有 4 個檔案被更改,包括 162 行新增109 行删除
  1. 30
    0
      CONTRIBUTING.md
  2. 71
    83
      LICENSE
  3. 3
    1
      README.md
  4. 58
    25
      server.js

+ 30
- 0
CONTRIBUTING.md 查看文件

@@ -0,0 +1,30 @@
1
+# Contributing to SMAM
2
+
3
+Contributions are more than welcome! There are several ways to get involved:
4
+
5
+## Bug reporting
6
+
7
+If you notice a bug while using SMAM, please open an [issue](https://github.com/babolivier/smam/issues) giving as much info as you can on your use of SMAM (without giving sensitive data, such as your full config file) that could be relevant for fixing this it.
8
+
9
+## Translation
10
+
11
+Since [v2.0.0](https://github.com/babolivier/smam/tree/v2.0.0), SMAM can be used in different languages depending on its configuration. However, it is still limited to the languages for which it has translations!
12
+
13
+If you want to help out by prividing translations in a language you know, you can do so by forking this repo, copying the file at [`locales/en.json`](https://github.com/babolivier/smam/blob/master/locales/en.json) somewhere, and translating the strings (only the ones on the right of the colon (:), the ones on the left with underscores (\_) are identifiers). If you haven't already done it, move and/or rename your file so it is located in the `locales` directory and is named `xx.json`, `xx` being the two-letter code for the language.
14
+
15
+Then send us your new translation by opening a [pull request](https://github.com/babolivier/smam/pulls)!
16
+
17
+## Code
18
+
19
+If you want to fix a bug, implement a cool feature or add some optimisation to SMAM, feel free to open a [pull request](https://github.com/babolivier/smam/pulls)!
20
+
21
+However, if you feel like you're up against a huge task, or just doesn't know where to start, don't hesitate to [open an issue](https://github.com/babolivier/smam/issues) so a SMAM contributor can help you out :smile:
22
+
23
+## Anything else
24
+
25
+The beauty of free software is that everyone can contribute in their own way! If you want to share a contribution that doesn't fit in the cases mentionned above (e.g. improvements on the contribution process, sharing a blog post about SMAM, etc), please [open an issue](https://github.com/babolivier/smam/issues)! It's the best way to get your stuff noticed and to start a conversation about it :grin:
26
+
27
+# Licensing
28
+
29
+SMAM is provided under the [AGPL v3](https://github.com/babolivier/smam/blob/master/LICENSE) license. Every contribution adding up to SMAM's repository must be released under this license.
30
+

+ 71
- 83
LICENSE 查看文件

@@ -1,23 +1,21 @@
1
-                    GNU GENERAL PUBLIC LICENSE
2
-                       Version 3, 29 June 2007
1
+                    GNU AFFERO GENERAL PUBLIC LICENSE
2
+                       Version 3, 19 November 2007
3 3
 
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5 5
  Everyone is permitted to copy and distribute verbatim copies
6 6
  of this license document, but changing it is not allowed.
7 7
 
8 8
                             Preamble
9 9
 
10
-  The GNU General Public License is a free, copyleft license for
11
-software and other kinds of works.
10
+  The GNU Affero General Public License is a free, copyleft license for
11
+software and other kinds of works, specifically designed to ensure
12
+cooperation with the community in the case of network server software.
12 13
 
13 14
   The licenses for most software and other practical works are designed
14 15
 to take away your freedom to share and change the works.  By contrast,
15
-the GNU General Public License is intended to guarantee your freedom to
16
+our General Public Licenses are intended to guarantee your freedom to
16 17
 share and change all versions of a program--to make sure it remains free
17
-software for all its users.  We, the Free Software Foundation, use the
18
-GNU General Public License for most of our software; it applies also to
19
-any other work released this way by its authors.  You can apply it to
20
-your programs, too.
18
+software for all its users.
21 19
 
22 20
   When we speak of free software, we are referring to freedom, not
23 21
 price.  Our General Public Licenses are designed to make sure that you
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
26 24
 want it, that you can change the software or use pieces of it in new
27 25
 free programs, and that you know you can do these things.
28 26
 
29
-  To protect your rights, we need to prevent others from denying you
30
-these rights or asking you to surrender the rights.  Therefore, you have
31
-certain responsibilities if you distribute copies of the software, or if
32
-you modify it: responsibilities to respect the freedom of others.
33
-
34
-  For example, if you distribute copies of such a program, whether
35
-gratis or for a fee, you must pass on to the recipients the same
36
-freedoms that you received.  You must make sure that they, too, receive
37
-or can get the source code.  And you must show them these terms so they
38
-know their rights.
39
-
40
-  Developers that use the GNU GPL protect your rights with two steps:
41
-(1) assert copyright on the software, and (2) offer you this License
42
-giving you legal permission to copy, distribute and/or modify it.
43
-
44
-  For the developers' and authors' protection, the GPL clearly explains
45
-that there is no warranty for this free software.  For both users' and
46
-authors' sake, the GPL requires that modified versions be marked as
47
-changed, so that their problems will not be attributed erroneously to
48
-authors of previous versions.
49
-
50
-  Some devices are designed to deny users access to install or run
51
-modified versions of the software inside them, although the manufacturer
52
-can do so.  This is fundamentally incompatible with the aim of
53
-protecting users' freedom to change the software.  The systematic
54
-pattern of such abuse occurs in the area of products for individuals to
55
-use, which is precisely where it is most unacceptable.  Therefore, we
56
-have designed this version of the GPL to prohibit the practice for those
57
-products.  If such problems arise substantially in other domains, we
58
-stand ready to extend this provision to those domains in future versions
59
-of the GPL, as needed to protect the freedom of users.
60
-
61
-  Finally, every program is threatened constantly by software patents.
62
-States should not allow patents to restrict development and use of
63
-software on general-purpose computers, but in those that do, we wish to
64
-avoid the special danger that patents applied to a free program could
65
-make it effectively proprietary.  To prevent this, the GPL assures that
66
-patents cannot be used to render the program non-free.
27
+  Developers that use our General Public Licenses protect your rights
28
+with two steps: (1) assert copyright on the software, and (2) offer
29
+you this License which gives you legal permission to copy, distribute
30
+and/or modify the software.
31
+
32
+  A secondary benefit of defending all users' freedom is that
33
+improvements made in alternate versions of the program, if they
34
+receive widespread use, become available for other developers to
35
+incorporate.  Many developers of free software are heartened and
36
+encouraged by the resulting cooperation.  However, in the case of
37
+software used on network servers, this result may fail to come about.
38
+The GNU General Public License permits making a modified version and
39
+letting the public access it on a server without ever releasing its
40
+source code to the public.
41
+
42
+  The GNU Affero General Public License is designed specifically to
43
+ensure that, in such cases, the modified source code becomes available
44
+to the community.  It requires the operator of a network server to
45
+provide the source code of the modified version running there to the
46
+users of that server.  Therefore, public use of a modified version, on
47
+a publicly accessible server, gives the public access to the source
48
+code of the modified version.
49
+
50
+  An older license, called the Affero General Public License and
51
+published by Affero, was designed to accomplish similar goals.  This is
52
+a different license, not a version of the Affero GPL, but Affero has
53
+released a new version of the Affero GPL which permits relicensing under
54
+this license.
67 55
 
68 56
   The precise terms and conditions for copying, distribution and
69 57
 modification follow.
@@ -72,7 +60,7 @@ modification follow.
72 60
 
73 61
   0. Definitions.
74 62
 
75
-  "This License" refers to version 3 of the GNU General Public License.
63
+  "This License" refers to version 3 of the GNU Affero General Public License.
76 64
 
77 65
   "Copyright" also means copyright-like laws that apply to other kinds of
78 66
 works, such as semiconductor masks.
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
549 537
 the Program, the only way you could satisfy both those terms and this
550 538
 License would be to refrain entirely from conveying the Program.
551 539
 
552
-  13. Use with the GNU Affero General Public License.
540
+  13. Remote Network Interaction; Use with the GNU General Public License.
541
+
542
+  Notwithstanding any other provision of this License, if you modify the
543
+Program, your modified version must prominently offer all users
544
+interacting with it remotely through a computer network (if your version
545
+supports such interaction) an opportunity to receive the Corresponding
546
+Source of your version by providing access to the Corresponding Source
547
+from a network server at no charge, through some standard or customary
548
+means of facilitating copying of software.  This Corresponding Source
549
+shall include the Corresponding Source for any work covered by version 3
550
+of the GNU General Public License that is incorporated pursuant to the
551
+following paragraph.
553 552
 
554 553
   Notwithstanding any other provision of this License, you have
555 554
 permission to link or combine any covered work with a work licensed
556
-under version 3 of the GNU Affero General Public License into a single
555
+under version 3 of the GNU General Public License into a single
557 556
 combined work, and to convey the resulting work.  The terms of this
558 557
 License will continue to apply to the part which is the covered work,
559
-but the special requirements of the GNU Affero General Public License,
560
-section 13, concerning interaction through a network will apply to the
561
-combination as such.
558
+but the work with which it is combined will remain governed by version
559
+3 of the GNU General Public License.
562 560
 
563 561
   14. Revised Versions of this License.
564 562
 
565 563
   The Free Software Foundation may publish revised and/or new versions of
566
-the GNU General Public License from time to time.  Such new versions will
567
-be similar in spirit to the present version, but may differ in detail to
564
+the GNU Affero General Public License from time to time.  Such new versions
565
+will be similar in spirit to the present version, but may differ in detail to
568 566
 address new problems or concerns.
569 567
 
570 568
   Each version is given a distinguishing version number.  If the
571
-Program specifies that a certain numbered version of the GNU General
569
+Program specifies that a certain numbered version of the GNU Affero General
572 570
 Public License "or any later version" applies to it, you have the
573 571
 option of following the terms and conditions either of that numbered
574 572
 version or of any later version published by the Free Software
575 573
 Foundation.  If the Program does not specify a version number of the
576
-GNU General Public License, you may choose any version ever published
574
+GNU Affero General Public License, you may choose any version ever published
577 575
 by the Free Software Foundation.
578 576
 
579 577
   If the Program specifies that a proxy can decide which future
580
-versions of the GNU General Public License can be used, that proxy's
578
+versions of the GNU Affero General Public License can be used, that proxy's
581 579
 public statement of acceptance of a version permanently authorizes you
582 580
 to choose that version for the Program.
583 581
 
@@ -635,40 +633,30 @@ the "copyright" line and a pointer to where the full notice is found.
635 633
     Copyright (C) <year>  <name of author>
636 634
 
637 635
     This program is free software: you can redistribute it and/or modify
638
-    it under the terms of the GNU General Public License as published by
636
+    it under the terms of the GNU Affero General Public License as published by
639 637
     the Free Software Foundation, either version 3 of the License, or
640 638
     (at your option) any later version.
641 639
 
642 640
     This program is distributed in the hope that it will be useful,
643 641
     but WITHOUT ANY WARRANTY; without even the implied warranty of
644 642
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
645
-    GNU General Public License for more details.
643
+    GNU Affero General Public License for more details.
646 644
 
647
-    You should have received a copy of the GNU General Public License
648
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
645
+    You should have received a copy of the GNU Affero General Public License
646
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
649 647
 
650 648
 Also add information on how to contact you by electronic and paper mail.
651 649
 
652
-  If the program does terminal interaction, make it output a short
653
-notice like this when it starts in an interactive mode:
654
-
655
-    <program>  Copyright (C) <year>  <name of author>
656
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
-    This is free software, and you are welcome to redistribute it
658
-    under certain conditions; type `show c' for details.
659
-
660
-The hypothetical commands `show w' and `show c' should show the appropriate
661
-parts of the General Public License.  Of course, your program's commands
662
-might be different; for a GUI interface, you would use an "about box".
650
+  If your software can interact with users remotely through a computer
651
+network, you should also make sure that it provides a way for users to
652
+get its source.  For example, if your program is a web application, its
653
+interface could display a "Source" link that leads users to an archive
654
+of the code.  There are many ways you could offer source, and different
655
+solutions will be better for different programs; see section 13 for the
656
+specific requirements.
663 657
 
664 658
   You should also get your employer (if you work as a programmer) or school,
665 659
 if any, to sign a "copyright disclaimer" for the program, if necessary.
666
-For more information on this, and how to apply and follow the GNU GPL, see
667
-<http://www.gnu.org/licenses/>.
668
-
669
-  The GNU General Public License does not permit incorporating your program
670
-into proprietary programs.  If your program is a subroutine library, you
671
-may consider it more useful to permit linking proprietary applications with
672
-the library.  If this is what you want to do, use the GNU Lesser General
673
-Public License instead of this License.  But first, please read
674
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
660
+For more information on this, and how to apply and follow the GNU AGPL, see
661
+<https://www.gnu.org/licenses/>.
662
+

+ 3
- 1
README.md 查看文件

@@ -145,7 +145,7 @@ A custom field is defined in the `customFields` section of your settings file, a
145 145
 
146 146
 ## Templating
147 147
 
148
-Each e-mail sent by the form follows a template described in `template.pug` (it's [Pug](pugjs.org/)). If you want to change the way the e-mails you receive are displayed in your mailbox, just edit it! You don't even need to restart the server aftewards :smile:
148
+Each e-mail sent by the form follows a template described in `template.example.pug` (it's [Pug](pugjs.org/)). If you want to change the way the e-mails you receive are displayed in your mailbox, just edit it! You don't even need to restart the server aftewards :smile:
149 149
 
150 150
 The template also features custom fields, iterating over the `custom` object, containing the field's label and user-input value:
151 151
 
@@ -156,6 +156,8 @@ The template also features custom fields, iterating over the `custom` object, co
156 156
 }
157 157
 ```
158 158
 
159
+The template needs to be named `template.pug`. If no template could be found under this name, SMAM will use a default one, which features both default and custom fields, and should be sufficient for non-advanced usage.
160
+
159 161
 ## Personnalising
160 162
 
161 163
 As you might have already seen, the contact form is generated without any form of style except your browser's default one. But that doesn't meen that you have to add an ugly form to your site to receive contact e-mails, as every element has a specific id (beginning with the `form_` prefix), allowing you to use your own style on your contact form.

+ 58
- 25
server.js 查看文件

@@ -1,17 +1,18 @@
1
-var pug			= require('pug');
2
-var nodemailer  = require('nodemailer');
3
-var crypto		= require('crypto');
4
-var settings	= require('./settings');
1
+var pug = require('pug');
2
+var nodemailer = require('nodemailer');
3
+var crypto = require('crypto');
4
+var fs = require('fs');
5
+var settings = require('./settings');
5 6
 
6 7
 // Translation
7
-var locale		= require('./locales/' + settings.language);
8
-var lang		= locale.server;
8
+var locale = require('./locales/' + settings.language);
9
+var lang = locale.server;
9 10
 
10 11
 // Web server
11
-var bodyParser	= require('body-parser');
12
-var cors		= require('cors');
13
-var express		= require('express');
14
-var app			= express();
12
+var bodyParser = require('body-parser');
13
+var cors = require('cors');
14
+var express = require('express');
15
+var app = express();
15 16
 
16 17
 // Logging
17 18
 var printit = require('printit');
@@ -28,6 +29,28 @@ var transporter = nodemailer.createTransport(settings.mailserver);
28 29
 // Verification tokens
29 30
 var tokens = {};
30 31
 
32
+// Default template
33
+// JavaScript has no native way to handle multi-line strings, so we put our template
34
+// in a comment inside a function fro which we generate a string.
35
+// cf: https://tomasz.janczuk.org/2013/05/multi-line-strings-in-javascript-and.html
36
+var defaultTemplate = (function() {/*
37
+html
38
+	body
39
+		p.subj
40
+			span(style="font-weight:bold") Subject:&nbsp;
41
+			span= subject
42
+		p.from
43
+			span(style="font-weight:bold") Sent from:&nbsp;
44
+			span= replyTo
45
+		each field in custom
46
+			p.custom
47
+				span(style="font-weight:bold")= field.label + ': '
48
+				span= field.value
49
+		p.message
50
+			span(style="font-weight:bold") Message:&nbsp;
51
+		
52
+		p= html
53
+*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
31 54
 
32 55
 // Serve static (JS + HTML) files
33 56
 app.use(express.static('front'));
@@ -104,23 +127,33 @@ app.post('/send', function(req, res, next) {
104 127
 	// Replacing the mail's content with HTML from the pug template
105 128
 	// Commenting the line below will bypass the generation and only user the
106 129
 	// text entered by the user
107
-	params.html = pug.renderFile('template.pug', params);
108
-
109
-	log.info(lang.log_sending, params.replyTo);
110
-
111
-	// Send the email to all users
112
-	sendMails(params, function(err, infos) {
130
+	fs.access('template.pug', function(err) {
131
+		// Checking if the template exists.
132
+		// If not, fallback to the default template.
133
+		// TODO: Parameterise the template file name.
113 134
 		if(err) {
114
-			log.error(err);
115
-		}
116
-		logStatus(infos);
117
-	}, function() {
118
-		if(status.failed === status.total) {
119
-			res.status(500).send();
135
+			params.html = pug.render(defaultTemplate, params);
120 136
 		} else {
121
-			res.status(200).send();
137
+			params.html = pug.renderFile('template.pug', params);
122 138
 		}
123
-	})
139
+
140
+		log.info(lang.log_sending, params.replyTo);
141
+
142
+		// Send the email to all users
143
+		sendMails(params, function(err, infos) {
144
+			if(err) {
145
+				log.error(err);
146
+			}
147
+			logStatus(infos);
148
+		}, function() {
149
+			if(status.failed === status.total) {
150
+				res.status(500).send();
151
+			} else {
152
+				res.status(200).send();
153
+			}
154
+		});
155
+	});
156
+
124 157
 });
125 158
 
126 159
 
@@ -334,4 +367,4 @@ function processCustom(custom) {
334 367
 	}
335 368
 
336 369
 	return fields;
337
-}
370
+}