Projects

  • # Description

    Description of your Plugin

  • About

    Easy and modular OpenSimulator management and deployment for Linux. I made this system for running and managing my own regions, first in OsGrid and now on a private microgrid. Designed for OpenSim 0.9 and higher.

    It’s probably not good enough for commercial-grade grids but makes life a lot easier for hobbyists running multiple sims in an open-to-connect grid (or your own microgrid).

    Isthmus only works with the isthmus specific opensim runtime and needs Mono 5.11 or better:
    https://github.com/lickx/opensim/tree/isthmus Alternatively, you can use your own opensim runtime, after applying the patches in doc/opensim-patches

    Features

    • Easily upgrade all sims at once
    • Shared config, database and caches
    • Logical folder hierarchy
    • Issue mass commands (simauto) or per-sim (simctl)
    • Flexible OAR backups
    • Crash detection (and restart if needed)
    • Dynamic port assignment (user definable range)
    • Easily set up a microgrid using robust
    • Only allow modern, non-shady viewers (optional)

    Preconfigured

    Works out of the box for:

    For more info see the contents of the doc folder

  • HotelDruid migration tool to WooCommerce (dev)

    This plugin is unstable. It addresses a specific need and is not intended for general distribution. Do not use it unless you are a developer and know what you do. You need to read, verify and adjust the code according to your needs.

    The intend of this plugin is to migrate booking data from an HotelDruid setup to a WordPress WooCommerce bookings solution.

  • droopescan.

    Build Status PyPI version

    A plugin-based scanner that aids security researchers in identifying issues with several CMS.

    Usage of droopescan for attacking targets without prior mutual consent is illegal. It is the end user’s responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program. Please note that while droopescan outputs the most CMS likely version installed on the remote host, any correlation between version numbers and vulnerabilities must be done manually by the user.

    CMS supported are:

    • Drupal.
    • SilverStripe.
    • WordPress.

    Partial functionality for:

    • Joomla (version enumeration and interesting URLs only).
    • Moodle (plugin & theme very limited, watch out)
    computer:~/droopescan$ droopescan scan drupal -u http://example.org/ -t 8
    [+] No themes found.
    
    
    
    

    [+] Possible interesting urls found: Default changelog file - https://www.example.org/CHANGELOG.txt Default admin - https://www.example.org/user/login

    [+] Possible version(s): 7.34

    [+] Plugins found: views https://www.example.org/sites/all/modules/views/ https://www.example.org/sites/all/modules/views/README.txt https://www.example.org/sites/all/modules/views/LICENSE.txt token https://www.example.org/sites/all/modules/token/ https://www.example.org/sites/all/modules/token/README.txt https://www.example.org/sites/all/modules/token/LICENSE.txt pathauto https://www.example.org/sites/all/modules/pathauto/ https://www.example.org/sites/all/modules/pathauto/README.txt https://www.example.org/sites/all/modules/pathauto/LICENSE.txt https://www.example.org/sites/all/modules/pathauto/API.txt libraries https://www.example.org/sites/all/modules/libraries/ https://www.example.org/sites/all/modules/libraries/CHANGELOG.txt https://www.example.org/sites/all/modules/libraries/README.txt https://www.example.org/sites/all/modules/libraries/LICENSE.txt entity https://www.example.org/sites/all/modules/entity/ https://www.example.org/sites/all/modules/entity/README.txt https://www.example.org/sites/all/modules/entity/LICENSE.txt google_analytics https://www.example.org/sites/all/modules/google_analytics/ https://www.example.org/sites/all/modules/google_analytics/README.txt https://www.example.org/sites/all/modules/google_analytics/LICENSE.txt ctools https://www.example.org/sites/all/modules/ctools/ https://www.example.org/sites/all/modules/ctools/CHANGELOG.txt https://www.example.org/sites/all/modules/ctools/LICENSE.txt https://www.example.org/sites/all/modules/ctools/API.txt features https://www.example.org/sites/all/modules/features/ https://www.example.org/sites/all/modules/features/CHANGELOG.txt https://www.example.org/sites/all/modules/features/README.txt https://www.example.org/sites/all/modules/features/LICENSE.txt https://www.example.org/sites/all/modules/features/API.txt [... snip for README ...]

    [+] Scan finished (0:04:59.502427 elapsed)

    You can get a full list of options by running:

    droopescan --help
    droopescan scan --help
    

    Why not X?

    Because droopescan:

    • is fast
    • is stable
    • is up to date
    • allows simultaneous scanning of multiple sites
    • is 100% python

    Installation

    Installation is easy using pip:

    apt-get install python-pip
    pip install droopescan
    

    Manual installation is as follows:

    git clone https://github.com/droope/droopescan.git
    cd droopescan
    pip install -r requirements.txt
    ./droopescan scan --help
    

    The master branch corresponds to the latest release (what is in pypi). Development branch is unstable and all pull requests must be made against it. More notes regarding installation can be found here.

    Features

    Scan types.

    Droopescan aims to be the most accurate by default, while not overloading the target server due to excessive concurrent requests. Due to this, by default, a large number of requests will be made with four threads; change these settings by using the --number and --threads arguments respectively.

    This tool is able to perform four kinds of tests. By default all tests are ran, but you can specify one of the following with the -e or --enumerate flag:

    • p — Plugin checks: Performs several thousand HTTP requests and returns a listing of all plugins found to be installed in the target host.
    • t — Theme checks: As above, but for themes.
    • v — Version checks: Downloads several files and, based on the checksums of these files, returns a list of all possible versions.
    • i — Interesting url checks: Checks for interesting urls (admin panels, readme files, etc.)

    More notes regarding scanning can be found here.

    Target specification.

    You can specify a particular host to scan by passing the -u or --url parameter:

        droopescan scan drupal -u example.org
    

    You can also omit the drupal argument. This will trigger “CMS identification”, like so:

        droopescan scan -u example.org
    

    Multiple URLs may be scanned utilising the -U or --url-file parameter. This parameter should be set to the path of a file which contains a list of URLs.

        droopescan scan drupal -U list_of_urls.txt
    

    The drupal parameter may also be ommited in this example. For each site, it will make several GET requests in order to perform CMS identification, and if the site is deemed to be a supported CMS, it is scanned and added to the output list. This can be useful, for example, to run droopescan across all your organisation’s sites.

        droopescan scan -U list_of_urls.txt
    

    The code block below contains an example list of URLs, one per line:

    http://localhost/drupal/6.0/
    http://localhost/drupal/6.1/
    http://localhost/drupal/6.10/
    http://localhost/drupal/6.11/
    http://localhost/drupal/6.12/
    

    A file containing URLs and a value to override the default host header with separated by tabs or spaces is also OK for URL files. This can be handy when conducting a scan through a large range of hosts and you want to prevent unnecessary DNS queries. To clarify, an example below:

    192.168.1.1 example.org
    http://192.168.1.1/ example.org
    http://192.168.1.2/drupal/  example.org
    

    It is quite tempting to test whether the scanner works for a particular CMS by scanning the official site (e.g. wordpress.org for wordpress), but the official sites rarely run vainilla installations of their respective CMS or do unorthodox things. For example, wordpress.org runs the bleeding edge version of wordpress, which will not be identified as wordpress by droopescan at all because the checksums do not match any known wordpress version.

    Authentication.

    The application fully supports .netrc files and http_proxy environment variables.

    Use a .netrc file for basic authentication. An example netrc (a file named .netrc placed in your root home directory) file could look as follows:

    machine secret.google.com
        login admin@google.com
        password Winter01
    

    You can set the http_proxy and https_proxy variables. These allow you to set a parent HTTP proxy, in which you can handle more complex types of authentication (e.g. Fiddler, ZAP, Burp)

    export http_proxy='user:password@localhost:8080'
    export https_proxy='user:password@localhost:8080'
    droopescan scan drupal --url http://localhost/drupal
    

    WARNING: By design, to allow intercepting proxies and the testing of applications with bad SSL, droopescan allows self-signed or otherwise invalid certificates. ˙ ͜ʟ˙

    Output.

    This application supports both "standard output", meant for human consumption, or JSON, which is more suitable for machine consumption. This output is stable between major versions.

    This can be controlled with the --output flag. Some sample JSON output would look as follows (minus the excessive whitespace):

    {
      "themes": {
        "is_empty": true,
        "finds": [
    
    
    
    

    ] }, "interesting urls": { "is_empty": false, "finds": [ { "url": "https://www.drupal.org/CHANGELOG.txt", "description": "Default changelog file." }, { "url": "https://www.drupal.org/user/login", "description": "Default admin." } ] }, "version": { "is_empty": false, "finds": [ "7.29", "7.30", "7.31" ] }, "plugins": { "is_empty": false, "finds": [ { "url": "https://www.drupal.org/sites/all/modules/views/", "name": "views" }, [...snip...] ] } }

    Some attributes might be missing from the JSON object if parts of the scan are not ran.

    This is how multi-site output looks like; each line contains a valid JSON object as shown above.

        $ droopescan scan drupal -U six_and_above.txt -e v
        {"host": "http://localhost/drupal-7.6/", "version": {"is_empty": false, "finds": ["7.6"]}}
        {"host": "http://localhost/drupal-7.7/", "version": {"is_empty": false, "finds": ["7.7"]}}
        {"host": "http://localhost/drupal-7.8/", "version": {"is_empty": false, "finds": ["7.8"]}}
        {"host": "http://localhost/drupal-7.9/", "version": {"is_empty": false, "finds": ["7.9"]}}
        {"host": "http://localhost/drupal-7.10/", "version": {"is_empty": false, "finds": ["7.10"]}}
        {"host": "http://localhost/drupal-7.11/", "version": {"is_empty": false, "finds": ["7.11"]}}
        {"host": "http://localhost/drupal-7.12/", "version": {"is_empty": false, "finds": ["7.12"]}}
        {"host": "http://localhost/drupal-7.13/", "version": {"is_empty": false, "finds": ["7.13"]}}
        {"host": "http://localhost/drupal-7.14/", "version": {"is_empty": false, "finds": ["7.14"]}}
        {"host": "http://localhost/drupal-7.15/", "version": {"is_empty": false, "finds": ["7.15"]}}
        {"host": "http://localhost/drupal-7.16/", "version": {"is_empty": false, "finds": ["7.16"]}}
        {"host": "http://localhost/drupal-7.17/", "version": {"is_empty": false, "finds": ["7.17"]}}
        {"host": "http://localhost/drupal-7.18/", "version": {"is_empty": false, "finds": ["7.18"]}}
        {"host": "http://localhost/drupal-7.19/", "version": {"is_empty": false, "finds": ["7.19"]}}
        {"host": "http://localhost/drupal-7.20/", "version": {"is_empty": false, "finds": ["7.20"]}}
        {"host": "http://localhost/drupal-7.21/", "version": {"is_empty": false, "finds": ["7.21"]}}
        {"host": "http://localhost/drupal-7.22/", "version": {"is_empty": false, "finds": ["7.22"]}}
        {"host": "http://localhost/drupal-7.23/", "version": {"is_empty": false, "finds": ["7.23"]}}
        {"host": "http://localhost/drupal-7.24/", "version": {"is_empty": false, "finds": ["7.24"]}}
        {"host": "http://localhost/drupal-7.25/", "version": {"is_empty": false, "finds": ["7.25"]}}
        {"host": "http://localhost/drupal-7.26/", "version": {"is_empty": false, "finds": ["7.26"]}}
        {"host": "http://localhost/drupal-7.27/", "version": {"is_empty": false, "finds": ["7.27"]}}
        {"host": "http://localhost/drupal-7.28/", "version": {"is_empty": false, "finds": ["7.28"]}}
        {"host": "http://localhost/drupal-7.29/", "version": {"is_empty": false, "finds": ["7.29"]}}
        {"host": "http://localhost/drupal-7.30/", "version": {"is_empty": false, "finds": ["7.30"]}}
        {"host": "http://localhost/drupal-7.31/", "version": {"is_empty": false, "finds": ["7.31"]}}
        {"host": "http://localhost/drupal-7.32/", "version": {"is_empty": false, "finds": ["7.32"]}}
        {"host": "http://localhost/drupal-7.33/", "version": {"is_empty": false, "finds": ["7.33"]}}
        {"host": "http://localhost/drupal-7.34/", "version": {"is_empty": false, "finds": ["7.34"]}}
    

    Debug.

    When things are not going exactly your way, you can check why by using the --debug-requests command.

    Some output might look like this:

    computer:~/droopescan# droopescan scan silverstripe -u http://localhost -n 10 -e p --debug-requests
    [head] http://localhost/framework/... 403
    [head] http://localhost/cms/css/layout.css... 404
    [head] http://localhost/framework/css/UploadField.css... 200
    [head] http://localhost/misc/test/error/404/ispresent.html... 404
    [head] http://localhost/widgetextensions/... 404
    [head] http://localhost/orbit/... 404
    [head] http://localhost/sitemap/... 404
    [head] http://localhost/simplestspam/... 404
    [head] http://localhost/ecommerce_modifier_example/... 404
    [head] http://localhost/silverstripe-hashpath/... 404
    [head] http://localhost/timeline/... 404
    [head] http://localhost/silverstripe-hiddenfields/... 404
    [head] http://localhost/addressable/... 404
    [head] http://localhost/silverstripe-description/... 404
    [+] No plugins found.
    
    
    
    

    [+] Scan finished (0:00:00.058422 elapsed)

    The --debug paramter also exists and may be used to debug application internals.

    Stats.

    You can get an up to date report on the capabilities of the scanner by running the following command

        droopescan stats
    

    Some sample output might look as follows:

    Functionality available for ‘drupal’:
    - Enumerate plugins (XXXX plugins.)
    - Enumerate themes (XXXX themes.)
    - Enumerate interesting urls (X urls.)
    - Enumerate version (up to version X.X.X-alphaXX, X.XX, X.XX.)
    Functionality available for ‘joomla’:
    - Enumerate interesting urls (X urls.)
    - Enumerate version (up to version XX.X, X.X.X, X.X.XX.rcX.)
    Functionality available for ‘wordpress’:
    - Enumerate interesting urls (X urls.)
    - Enumerate version (up to version X.X.X, X.X.X, X.X.X.)
    Functionality available for ‘silverstripe’:
    - Enumerate plugins (XXX plugins.)
    - Enumerate themes (XX themes.)
    - Enumerate interesting urls (X urls.)
    - Enumerate version (up to version X.X.XX, X.X.XX, X.X.XX.)
    

    It is important to verify that the latest version available for the CMS installation is available within droopescan, as otherwise results may be inaccurate.

    Contribute.

    Create your own plugin.

    You can add suport for your favourite CMS. The process is actually quite simple, and a lot of information can be glimpsed by viewing the example.py file in the plugins/ folder.

    This file should serve well as a base for your implementation.

    You can create your own plugin for Joomla and enable it as follows:

    $ cp plugins/example.py plugins/joomla.py
    $ cp plugins.d/example.conf plugins.d/joomla.conf
    

    You then need to go to plugins/joomla.py and change a few things:

    • The class name needs to be Joomla.
    • The plugin label (located at Meta.label) needs to be changed to joomla.
    • At the end of the file, the register call needs to be modified to reflect the correct class name.
    • The exposed function, ‘example’, needs to be renamed to joomla.
        @controller.expose(help='example scanner')
        def joomla(self):
            self.plugin_init()
    

    We also need to change the plugins.d/joomla.conf file, and change it to the following:

    [joomla]
    enable_plugin = true
    

    We should now be in a state which looks as follows:

    $ droopescan scan joomla
    [+] --url parameter is required.
    

    Your next step would be to generate a valid plugin wordlist, a valid theme wordlist, a versions.xml file, and optionally a list of interesting URLs, as well as replace all variables that are in joomla.py with values that are correct for your implementation.

    The plugin needs to update automatically in order for a pull request to be accepted. Further documentation may be later made available, but for now, keep in mind that the update_version_check, update_version, update_plugins_check and update_plugins need to be implemented. For reference, please review the drupal.py file. This is required in order to ensure plugins are kept to date.

    Issues & Pull Requests.

    Pull requests that create new plugins are welcome provided that maintenance for those plugins is done automatically.

    Please remember to make your pull requests against the develoment branch rather than the master. Issues can be raised on the issue tracker here on GitHub.

    To run tests, some dependencies must be installed. Running the following commands will result in them being installed and the tests being ran:

        apt-get install libxslt1-dev libxml2-dev zlib1g-dev python python-pip python-dev python3 python3-pip python3-dev
        pip install -r requirements.txt -r requirements_test.txt
        pip3 install -r requirements.txt -r requirements_test.txt
        ./droopescan test
    

    You can run individual tests with the -s flag.

    ./droopescan test -s test_integration_drupal
    

    License.

    The project is licensed under the AGPL license.

  • Documents from Git – Oli’s version

    This WordPress Plugin lets you easily publish, collaborate on and version control your [Markdown, Jupyter notebook] documents directly from your favorite remote Git platform, even if it’s self-hosted.

    The advantages are:

    • Write documents in your favorite editor and just push to your remote repository to update your blog instantly
    • Use the power of version control: publish different versions of the document in different posts, i.e. from another branch or commit than latest master
    • Easy to update by your readers via pull requests, minimizing the chance of stale tutorials

    The following document types are currently supported:

    • Markdown
    • Jupyter notebooks (only for public repositories)

    The following platforms are currently supported:

    • Github
    • Bitbucket
    • Gitlab

    Usage

    Note, this plugin uses Github’s wonderful /markdown API to render to HTML. This comes with 2 caveats:

    1. Unless authenticated, the rate limit is set at 60 requests per minute. Since v1.1.0 the plugin is capable of statically caching content. In case that’s not dynamic enough for you, your only option currently is to not use any cache in which case every document will be pulled from your provider every time someone opens it on your site. Then it’s strongly recommended to create a Github access token and register it with the plugin. Then the rate limit will be set to 5000 requests per hour. See Global attributes section for details on how to do that.
    2. The Markdown content cannot exceed 400 KB, so roughly 400 000 characters incl whitespace. If not a monographic dissertation, this should not be an applicable limit though.

    Configuration

    In the main menu Settings > Documents from Git you can set all important global settings.

    Note: previous config.json is deprecated now due to security concerns.

    Shortcodes

    The features of the plugin are provided through shortcodes. You can use them in your posts, pages or custom post types.

    Publish documents

    [git-<platform>-<action>] The document-specific shortcode

    • <platform> can be one of
      • github: if you use Github as your VCS platform
      • bitbucket: if you use Bitbucket as your VCS platform
      • gitlab: if you use Gitlab as your VCS platform
    • <action> can be one of
      • markdown: Render your Markdown files hosted on your VCS platform in Github’s rendering style
      • jupyter: Render your Jupyter notebook hosted on your VCS platform (only for public repositories)
      • checkout: Renders a small badge-like box with a link to the document and the date of the last commit
      • history: Renders a <h2> section with the last commit dates, messages and authors

    Manipulate rendering style

    [git-add-css] adds a <div id="git-add-css" class="<classes_attribute>" to wrap content. That way you can manipulate the style freely with additional CSS classes. Follow these steps:

    1. Add a CSS file to your theme’s root folder, which contains some classes, e.g. class1, class2, class3
    2. Enqueue the CSS file by adding wp_enqueue_style('my-style', get_template_directory_uri().'/my-style.css'); to the theme’s functions.php
    3. Add the enclosing git-add-css shortcode to your post with the custom CSS classes in the classes attribute, e.g.:
    [git-add-css classes="class1 class2 class3"]
        [git-gitlab-checkout url=...]
        [git-gitlab-markdown url=...]
        [git-gitlab-history url=...]
    [/git-add-css]

    Attributes

    Each shortcode takes a few attributes, indicating if it’s required for public or private repositories:

    • url: The URL of the document in the repository
      • Type: string
      • Action: all except git-add-css
      • Public repo: :ballot_box_with_check:
      • Private repo: :ballot_box_with_check:
    • user: The user name (not email) of an authorized user
      • Type: string
      • Action: all except git-add-css
      • Public repo: :negative_squared_cross_mark:
      • Private repo: :ballot_box_with_check:
    • token: The access token/app password for the authorized user
      • Type: string
      • Action: all except git-add-css
      • Public repo: :negative_squared_cross_mark:
      • Private repo: :ballot_box_with_check:
    • cache_ttl: The time in seconds that the plugin will cache, only for cache_strategy=static.
      • Type: integer
      • Action: all except git-add-css
      • Public repo: :negative_squared_cross_mark:
      • Private repo: :negative_squared_cross_mark:
    • cache_strategy: Only static caching is implemented so far. dynamic caching is on the way!
      • Type: integer
      • Action: all except git-add-css
      • Public repo: :negative_squared_cross_mark:
      • Private repo: :negative_squared_cross_mark:
    • limit: Limits the history of commits to this number. Default 5.
      • Type: integer
      • Action: history
      • Public repo: :negative_squared_cross_mark:
      • Private repo: :negative_squared_cross_mark:
    • classes: The additional CSS classes to render the content with
      • Type: string
      • Action: git-add-css
      • Public repo: :ballot_box_with_check:
      • Private repo: :ballot_box_with_check:

    Caching

    Often we need to prioritize speed when loading content and, in addition, it is very costly to fetch, load and format the content every time we need to read the content of the post.

    This plugin soon offers 2 methods for caching, static and dynamic which can be set via the cache_strategy property.

    • Static caching (cache_strategy=static)

    This is the default strategy, as it doesn’t require any user action.

    The property cache_ttl sets how many seconds the content cache will keep alive.

    Currently there’s no way to flush the cache manually. However, changing cache_ttl or the history limit will create a new cache.

    • Dynamic caching (cache_strategy=dynamic)

    This is not implemented yet. See #20 for details.

    Token authorization

    You need to authorize via user and token if you intend to publish from a private repository. You don’t need to authorize if the repository is open.

    However, keep in mind that some platforms have stricter API limits for anonymous requests which are greatly extended if you provide your credentials. So even for public repos it could make sense. And unless you use this plugin’s caching capabilities, it’s strongly recommended to register a Github access token regardless of the VCS hosting platform, see the beginning of the chapter.

    How to generate the token depends on your platform:

    This plugin needs only Read access to your repositories. Keep that in mind when creating an access token.

    Examples

    We publish our own tutorials with this plugin: https://gis-ops.com/tutorials/.

    • Publish Markdown from Github

    [git-github-markdown url="https://github.com/gis-ops/tutorials/blob/master/qgis/QGIS_SimplePlugin.md"]

    • Publish Markdown from Github with 1 hour cache

    [git-github-markdown url="https://github.com/gis-ops/tutorials/blob/master/qgis/QGIS_SimplePlugin.md" cache_ttl="3600" cache_strategy="static"]

    • Publish Jupyter notebook from Github

    [git-github-jupyter url="https://github.com/GIScience/openrouteservice-examples/blob/master/python/ortools_pubcrawl.ipynb"]

    • Publish from a private repository

    [git-bitbucket-jupyter user=nilsnolde token=3292_2p3a_84-2af url="https://bitbucket.org/nilsnolde/test-wp-plugin/src/master/README.md"]

    • Display last commit and document URL from Bitbucket

    [git-bitbucket-checkout url="https://bitbucket.org/nilsnolde/test-wp-plugin/src/master/README.md"]

    • Display commit history from Gitlab

    git-gitlab-history limit=5 url="https://gitlab.com/nilsnolde/esy-osm-pbf/-/blob/master/README.md"]

    • Use additional CSS classes to style

    The following example will put a dashed box around the whole post:

        [git-add-css classes="md-dashedbox"]
            [git-github-checkout url="https://github.com/gis-ops/tutorials/blob/master/qgis/QGIS_SimplePlugin.md"]
            [git-github-markdown url="https://github.com/gis-ops/tutorials/blob/master/qgis/QGIS_SimplePlugin.md"]
            [git-github-history url="https://github.com/gis-ops/tutorials/blob/master/qgis/QGIS_SimplePlugin.md"]
        [/git-add-css]

    With the following CSS file contents enqueued to your theme:

    
        div.md_dashedbox {
            position: relative;
            font-size: 0.75em;
            border: 3px dashed;
            padding: 10px;
            margin-bottom:15px
        }

    div.md_dashedbox div.markdown-github { color:white; line-height: 20px; padding: 0px 5px; position: absolute; background-color: #345; top: -3px; left: -3px; text-transform:none; font-size:1em; font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; }

    Installation

    WordPress.org

    The latest version is on Oli’s GitHub repository

    https://github.com/magicoli/documents-from-git

    There is no automatic update process from GitHub. You need to download the latest release and upload it to your WordPress installation, or, for advanced users, clone the repository into your wp-content/plugins folder and use git features.

    Note: The release from the original author on WordPress plugin store is deprecated and does not receive updates Documents from Git.

    Troubleshooting

    For troubleshooting and frequently asked questions, please refer to the FAQ page.

    Acknowledgements

    Contributions from other projects

    The file structure has been reorganised from the original version to make it more maintainable and to follow WordPress best practices, mainly bringing the wordpress file structure to the root folder, so applying this repo modifications to an original clone might need some extra preparation, but is not impossible.

    PDC Sponsored the Bitbucket integration.

  • Disable Password Change Notification

    Simple plugin to disable admin notifications when users change their password. No configuration, activate the plugin and voilà.

  • Bash helpers

    Copyright 2015 Olivier van Helden olivier@van-helden.net. Released under GNU Affero GPL v3.0 license, unless otherwise stated. http://www.gnu.org/licenses/agpl-3.0.html

    A couple of useful tools for bash scripting.

    helpers

    Put this line at the beginning of your script (do not run the file directly, source it):

    . /path/to/helpers

    and use these functions inside the script

    end [errornumber] [message]
    log [errornumber] [message]
    readvar [var]
    yesno [-y] ["message"]
    ucfirst [string]

    ini_parser

    A tool to read .ini config in bash scripts

    let’s say you have a .ini file with this content

    [Default]
        name = "Albert"
    [Smart]
        name = "Einstein"

    Put this line at the beginning of your script (do not run the file directly, source it):

    . /path/to/ini_parser

    And, where you need it

    ini.parse /path/to/config/file.ini
    ini.section.Default
    echo $name

    Output: Albert

    Then, later… (no need to repeat ini.parse /path/to/config/file.ini)

    ini.section.Smart
    echo $name

    Output: Einstein

    Voilà ! (en français dans le texte)

    More details inside ini_parser

  • Band Tools

    Post types and tools for bands. Allow publishing of records with songs list. Easy enough for a single band. Complete enough for several ones.

    Although you can get this plugin for free, buying it will fund development and help providing future features.

  • automatic-theme-plugin-update

    Automatic Theme & Plugin Updater for Self-Hosted Themes/Plugins

    Support This Developer: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SE9ZVJUS324UC

    Any amount is always appreciated

    General Info

    For themes and plugins that can’t be submitted to official WordPress repository, ie … commercial themes/plugins/, non-gpl licensed, written for one client.

    Folder structure

    • api (Folder to upload to server where updates will be housed)
      • .htaccess (set Options+Indexes to allow checking to work properly)
      • index.php (holds code used to check request for new versions)
        • packages.php (file containing all info about plugins and themes)
      • download.php (validates md5 key of date and package zip file)
      • update (folder to hold all zip file updates for url masking – protected by .htaccess to disallow file listings)
    • update (default folder for holding theme and plugin zip files)
      • .htaccess (prevents indexing and viewing of any zip files in directory)
    • plugin (folder for adding plugin update checking)
      • test-plugin-update (simple plugin folder to show how update functions work)
        • test-plugin-update.php (example plugin that only checks for updates to server)
    • theme (folder for theme update checking)
      • update.php (file that can be included from functions.php of theme to check for updates)

    Important:

    Change $api_url to your api server url in:

    /plugin/test-plugin-update/test-plugin-update.php /theme/update.php

    Adding new versions

    Edit the packages.php under api folder on your server. Commented thoroughly throughout with sections that need to be changed to reflect themes/plugins that are to be updated.

    Adding additional themes/plugins

    Simply create another $package array with the key of the new theme/plugin slug and add all the appropriate info. When releasing the theme/plugin make sure that functions and variables are prefixed to prevent errors and allow multiple themes/plugins to be updated.

    Child theme support

    Child themes are now supported. If the theme being updated is meant to be a parent theme the standard theme/update.php from the theme file will work. If the theme is a child theme of another theme comment out the parent theme section and uncomment the child theme section on the theme/update.php

    Securing Download location

    Downloads are now always secured by a md5 hash of the package file_name and timestamp of current date. When downloading file current timestamp and timestamp of previous day are compared to key received from update request, if either match zip file is passed, and file can be downloaded.