This page details the parent page. It may include information such as the format or structure used to implement a feature.


Setting up postfix for redirecting bounced emails is actually very easy, but I have to say that the documentation is total crap in that regard. Also most of the posts I found about it are blatantly wrong! They often speak of using VERP, which is a cheap way of knowing to whom the email was sent. But that means you need to have hundred of emails and it causes problems with greylists. Also some mail systems do not correctly support VERP.

First you want to make sure that the snapbounce package is installed. You may check for the availability with:

snapbounce --version

The ...

The permissions have been implemented for a little while now and have proven to be working very well even in a rather complicated environment where various new pages are only accessible to a small group of users.

When a user or a page are linked to permission page, the permission gets added recursively. That means that one page and all of its children, children of children, etc. recursively, all get added.

1) Gathering of User Rights

When gathering the user rights, the permissions plugin first determines the user login capability. The user does not need to currently be logged in. That ...

The editor uses a similar form capability which allows one to create a form without having to write all the HTML tags needed to handle each widget. Actually, one widget may include many tags and it can be so complicated that attempting to rewrite those tags by hand each time would be really tedious.

The core system offers the basic widgets such as a simple text edit and image drag and drop area. We already support one widget extension called locale allowing the user to select a timezone. This is an external extension to the editor.

Each widget needs at least one attribute defining their ...

Editor: Hidden Widget

The Hidden widget is used to include data in a form that has to be hidden. The concept is pretty simple, it allows us to have a session identifier in forms without having to show that identifier to the end users. The form session identifier is necessary to allow the saving of the data in the form. Otherwise we assum that a hacker is trying to send spam to the server.

In standard HTML forms, one can use an input typed "hidden". Many people make use of those to carry data on the client side instead of the server side. We strongly suggest that you instead make use of the user session ...

Editor Implementation

Implementation Details

The following shows you a UML like graph of the current editor.js implementation. Click on the figure to see a full size version. The original file (editor.odg) can be downloaded as an attachment (see below).

Current Editor Implementation.

OAuth2 Implementation

The OAuth2 implementation on Snap! Websites makes use of a GET to log an application in, and a GET to log it out.

Log In

The Log In feature makes use of the Snap-Authorization header field which is 100% copied from the Basic Authorization. We use the name Snap-Authorization because Apache2 does not forward the Authorization header field to Snap!

GET /user/oauth2 HTTP 1.1
User-Agent: Application 1.0
Accept: application/json;q=0.7,application/xml;q=0.5
Snap-Authorization: Snap <base64 from "identifier:secret">

The OAuth2 module gives users two ...

PayPal Implementation

The PayPal implementation has been implemented in C++ following the recently developed REST API.

The current implementation supports straight sales and recurring payment plans with setup fees. Recurring payments are limited to ONE recurring product and any number of optional recurring payment setup fee products. All payments are using the PayPal payment method (opposed to PayPal Pro that allows you to directly charge credit card on your website.)

The way the system works with the REST API is different from the SOAP API most of us have been used to. The main significant difference is that ...

When sending the user to your website, it is possible to request the website to add or remove items to the e-Commerce cart. This is done using links build as a set of commands as defined here.

The cart understands the special query string named "cart". The string is built with a set of letters and parameters. The letter 'p' stands for product and it is the activator, meaning that all the parameters prior apply to this 'p', then the parameters get reset. For this reason, you generally want the 'p' command last.

Note that the query string is interpreted ...


TBD: we may want to derive all the data used in the SNSD files from Data Types feature (schema).

The basic of SNSD (Snap Software Description) is an XML file that describes various types of software products (libraries, servers, GUI based software, etc.) On a Snap! website a page used to describe a software product can have a link to SNSD meaning that that page represents a file that should appear in the SNSD catalog.

The XML files offered give third party systems a way to quickly learn about all the files that you are offering. The SNSD data can be found on specific pages, in the HTML ...

The process can be hard to follow because many signals get called.

The following is an attempt in helping you (developers) find your way better in the Snap! environment.

  1. snap.cgi gets called by Apache
  2. snap.cgi connects to snapserver
  3. snap.cgi sends the Apache parameters to snapserver
  4. snapserver creates a snap_child object
  5. snap_child verifies the data sent by snap.cgi
  6. snap_child loads the plugins
  7. snap_child calls the execute() signal
  8. path plugin responds by checking that the path is valid:
    1. Page is in Cassandra: get the ...

Snap! Websites
An Open Source CMS System in C++

Contact Us Directly