App update framework for Windows, inspired by Sparkle for macOS

Overview

Build status Crowdin

About

WinSparkle is a plug-and-forget software update library for Windows applications. It is heavily inspired by the Sparkle framework for OS X written by Andy Matuschak and others, to the point of sharing the same updates format (appcasts) and having very similar user interface.

See https://winsparkle.org for more information about WinSparkle.

Documentation: wiki and the winsparkle.h header.

Using prebuilt binaries

The easiest way to use WinSparkle is to download the prebuilt WinSparkle.dll binary.

Bindings

WinSparkle has a C API that makes it easy to use from many modern languages in addition to C/C++. In addition to that, several bindings for popular languages exist:

Building from sources

If you prefer to build WinSparkle yourself, you can do so. You'll have to compile from a git checkout; some of the dependencies are included as git submodules.

Check the sources out and initialize the submodules:

$ git clone git://github.com/vslavik/winsparkle.git
$ cd winsparkle
$ git submodule init
$ git submodule update

To compile the library, just open WinSparkle.sln (or the one corresponding to your compiler version) solution and build it.

At the moment, projects for Visual C++ (2010 and up) are provided, so you'll need that (Express/Community edition suffices). In principle, there's nothing in the code preventing it from being compiled by other compilers.

There are also unsupported CMake build files in the cmake directory.

DSA signatures

WinSparkle uses exactly same mechanism for signing and signature verification as Sparkle Project does. Its tools and verification methods are fully compatible.

You may use any compatible way to sign your update. To achieve this, you need to sign SHA1 (in binary form) of your update file with DSA private key, using SHA1 digest.

WinSparkle provides tools to generate keys and sign the update using OpenSSL.

You need openssl.exe available on Windows to use those tools (available as precompiled binary).

Alternatively, you can generate keys and sign your updates even on macOS or Linux, using tools provided by Sparkle project.

Prepare signing with DSA signatures:

  • First, make yourself a pair of DSA keys. This needs to be done only once. WinSparkle includes a tool to help: bin\generate_keys.bat
  • Back up your private key (dsa_priv.pem) and keep it safe. You don’t want anyone else getting it, and if you lose it, you may not be able to issue any new updates.
  • Add your public key (dsa_pub.pem) to your project either as Windows resource, or any other suitable way and provide it using WinSparkle API.

Sign your update

When your update is ready (e.g. Updater.exe), sign it and include signature to your appcast file:

  • Sign: bin\sign_update.bat Updater.exe dsa_priv.pem
  • Add standard output of previos command as sparkle:dsaSignature attribute of enclosure node of your appcast file. Alternatively sparkle:dsaSignature can be a child node of enclosure.

Where can I get some examples?

Download the sources archive and have a look at the examples/ folder.

Using latest development versions

If you want to stay at the bleeding edge and use the latest, not yet released, version of WinSparkle, you can get its sources from public repository. WinSparkle uses git and and the sources are hosted on GitHub at https://github.com/vslavik/winsparkle

WinSparkle uses submodules for some dependencies, so you have to initialize them after checking the tree out:

$ git clone git://github.com/vslavik/winsparkle.git
$ cd winsparkle
$ git submodule init
$ git submodule update

Then compile WinSparkle as described above; no extra steps are required.

Issues
  • .NET bindings

    .NET bindings

    This PR take part of solving issue #20.

    It keep the way project where organized.

    • New C# assembly project into WinSparkle-2013 and WinSparkle-2015 (WinSparkleDotNet)
    • New WinForm example project into examples-2013 and examples-2015 (example_dotnet.csproj)

    And try to correct most of the problems from pull #55.

    This don't add the feature as unique DLL for C#. This will come after, if this is validated. Target WinSparkle API 0.5.X (from master)

    Has bugs 
    opened by Herve-M 27
  • Cmake for MinGW

    Cmake for MinGW

    It tested with Windows MinGW Qt 5.3.1 and Fedora MinGW. For MSVC 2010 I can't build. Probably support for MSVC can be added. But I haven't such wishes atm.

    opened by drizt 27
  • Keeps installing old, cached, version

    Keeps installing old, cached, version

    I'm trying out WinSparkle for a project, and it seems to have been working nicely until now, where I've had the following problem:

    On update check, WinSparkle correctly reads the cast and sees that a new version is available. It doesn't, however, download the new version but instead installs the same old version that was downloaded for an earlier update.

    Do you have any idea as to why this is happening and how to prevent it?

    opened by kschwan 15
  • Add DSA signature verification (OpenSSL based)

    Add DSA signature verification (OpenSSL based)

    Compatible with Sparkle method of DSA signing and verification.

    Uses OpenSSL and adds external dependency: libeay32.dll (but NOT ssleay32.dll).

    Theoretically can be reimplemented, to use WinAPI only.

    Reffers to #23.

    Important 
    opened by Youw 14
  • Correctly displaying responsive release notes

    Correctly displaying responsive release notes

    I'm trying to display release notes published on a WordPress site that uses a fully responsive design. The release notes are displayed correctly on an iPhone and in Internet Explorer 11 when I resize to the width of WinSparkle's release notes control.

    When displayed by WinSparkle, however, the release notes are not rendered correctly. The browser control shows a horizontal scrollbar and displays only about 60% of the page width. And the page is a bit blurry.

    This does not happen with the plain HTML release notes based on which I created the WordPress post. No horizontal scrollbar is shown.

    I'd be thankful for any hints on how this could be fixed (e.g., by configuring the control in a different way).

    opened by ThomasBarnekow 14
  • Added limited support to the sparkle:tag criticalupdate

    Added limited support to the sparkle:tag criticalupdate

    Updated the xml parser with a simple checker for whether criticalupdate tag is present at present, it only detects the tag in this form, though it can be extended to support the way sparkle 2 does with a bit of effort.

     <sparkle:tags>
         <sparkle:criticalupdate/>
     </sparkle:tags>
    

    p.s. this does not parse the specific version string embedded in the criticalupdate tag. it also doesn't deal with the case where criticalupdate tag appears outside of sparkle:tags

    On detecting this particular tag in the appcast.xml, the installer wizard will make the following changes to stateupdateavailable

    • Hide the skip & remind me later buttons.
    • Hide the close button on the title bar of the dialog box
    opened by edwinclement08 12
  • Allow manipulation of WinSparkle settings with user provided functions

    Allow manipulation of WinSparkle settings with user provided functions

    Added win_sparkle_set_config_methods(), which can be used to override WinSparkle's default Windows Registry interface with custom functions, so users can provide their own functions when they want to manage all configuration by themselves.

    opened by lanyizi 12
  • Downloads fail if server doesn't set Connection: keep-alive

    Downloads fail if server doesn't set Connection: keep-alive

    I debugged into the source code, I think it was introduced in commit: Don't fail downloads on redirects to another server

    In my case, it can easily go to line 355 !!

    This happens on version > 0.5.2.

    opened by sinall 12
  • [download] - don't close handle when receiving INTERNET_STATUS_CONNECTION_CLOSED

    [download] - don't close handle when receiving INTERNET_STATUS_CONNECTION_CLOSED

    This PR fixes 302 redirects for our mirror system (http://mirrors.kodi.tv).

    We are using the following appcast.xml (which you can use easily in your "example_psdk" for reproduction aswell): https://raw.githubusercontent.com/xbmc/SparkleBackend/fix_redirects_demo/sparkleupdate.xml

    This announces this file for download:

    http://mirrors.kodi.tv/test-builds/win32/KodiSetup-20170611-bb3345af02-sparkle-x86.exe

    The mirrors are using mirrorbits and are redirecting to the actual mirror with a 302 found status. (URL redirection).

    The dwInternetStatus in the callback when trying to download that file is as follows:

    INTERNET_STATUS_HANDLE_CREATED INTERNET_STATUS_DETECTING_PROXY INTERNET_STATUS_RESOLVING_NAME INTERNET_STATUS_NAME_RESOLVED INTERNET_STATUS_CONNECTING_TO_SERVER INTERNET_STATUS_CONNECTED_TO_SERVER INTERNET_STATUS_SENDING_REQUEST INTERNET_STATUS_REQUEST_SENT INTERNET_STATUS_RECEIVING_RESPONSE INTERNET_STATUS_RESPONSE_RECEIVED INTERNET_STATUS_CLOSING_CONNECTION INTERNET_STATUS_CONNECTION_CLOSED <- this one is the Problem because in the original callback handler it closes the client side handle INTERNET_STATUS_REDIRECT INTERNET_STATUS_DETECTING_PROXY INTERNET_STATUS_RESOLVING_NAME INTERNET_STATUS_NAME_RESOLVED INTERNET_STATUS_CONNECTING_TO_SERVER INTERNET_STATUS_CONNECTED_TO_SERVER INTERNET_STATUS_SENDING_REQUEST INTERNET_STATUS_REQUEST_SENT INTERNET_STATUS_RECEIVING_RESPONSE INTERNET_STATUS_RESPONSE_RECEIVED INTERNET_STATUS_REQUEST_COMPLETE

    This means we are operating on an invalid/closed handle after the request was completed and we try to download the file.

    Closing the handle in the callback is not needed at all. Because of the destructor of the struct InetHandle will close the handle as soon as the InetHandle conn goes out of scope from the DownloadFile method.

    This change allows us to use winsparkle for our project with the big mirror system as backend.

    Thx for considering a merge.

    Regards Memphiz of Team Kodi.

    opened by Memphiz 12
  • Z ordering wrong

    Z ordering wrong

    In using winsparkle with a qt application, I call win_sparkle_init() in the showEvent() of the main widget. But, winsparkle pops up behind my application. I am using Windows 8.1 x64 and Qt 5.3.2.

    opened by adipose 11
  • Detect download failures due to timeouts or network connectivity issues

    Detect download failures due to timeouts or network connectivity issues

    Detect download failures due to timeouts or network connectivity issues and throw an error (instead of erroneously showing the download as complete). Because these failures also return 'dwBufferLength = 0' like a successful download, we detect them by checking the number of received bytes against the Content Length (only if it is available). If there is a mismatch, an error is thrown. Otherwise, the download is considered successful.

    opened by nickdademo 10
  • Add preliminary EdDSA validation support

    Add preliminary EdDSA validation support

    Add preliminary EdDSA validation support (partially closes #187 as signing is still missing). I tested with valid and invalid signature and it seems to work. Note that more testing is probably needed.

    Some comments:

    • Uses https://github.com/orlp/ed25519.git like the primary Sparkle project, causes minimal size increase of the final dll.
    • Public key verfication is not there yet, I guess it is enough to just do the Base64 decoding + size check?
    • Not sure I updated bakefile/vcxproj correctly. I get some errors, but it everything looks fine. The only thing is that the format changed a bit (I guess I'm using a different version of bakefile as the current files were generated with).
    • Do we need that complicated file reading? I admit I took the first snippet from StackOverflow on how to read full files on windows.
    • RC integration not tested (I'm not primarily a Windows developer, I'm just trying to port one of my apps to Windows).

    Tagging @kornelski and @vslavik.

    opened by ntadej 0
  • vcpkg integration

    vcpkg integration

    VCPKG is a C++ Library Manager for Windows https://github.com/microsoft/vcpkg It is driven by cmake and allows to integrate libraries with various build systems like msbuild.

    I have crated a port for WinSpakles here https://github.com/microsoft/vcpkg/pull/17563

    During the code review I have been ask to link against the libraries that are already build by vcpkg and not against the source 3rdparty library.

    What is the best way to do it?

    Is there a chance that the required changes are integrated here?

    opened by daschuer 1
  • Add option to auto install after download when using win_sparkle_check_update_with_ui()

    Add option to auto install after download when using win_sparkle_check_update_with_ui()

    When win_sparkle_check_update_with_ui() is used to allow the user to manually check for an update (i.e. via a menu item), the flow is the following (assuming an update is available):

    1. Click menu item to check for updates
    2. WinSparkle dialog shows that a new version is available
    3. User clicks "Install update"

    image

    1. Update starts downloading
    2. After download is complete, the user must then again click "Install update"

    image

    This PR allows the additional (and maybe redundant?) confirmation at Step (5) to be skipped and the update to be automatically installed after downloading, via an arg: win_sparkle_check_update_with_ui(1);

    This is achieved in code by using two flags for the auto logic: one each for download and install

    opened by nickdademo 5
  • UI bug when moving an error alert between different-DPI displays

    UI bug when moving an error alert between different-DPI displays

    Steps to reproduce:

    1. Basic WinSparkle setup without a valid DSAPub key (to trigger the error alert).
    2. Check for Updates on a 100% (96 DPI) display - an alert is presented (Screenshot1).
    3. Move the alert to a 125% display - the alert message doesn't enlarge, AND the Cancel button is cut (Screenshot2).
    4. Move the app's main window to the 125% display and Check for Updates again - the alert looks somewhat better (the message is not enlarged, but the button is not cut at least) (Screenshot3).

    I'm just starting out with WinSparkle, haven't gotten to its main UI yet, so perhaps this problem is applicable not only to its alerts.

    Screenshot1

    Screenshot2

    Screenshot3

    opened by supersv 5
  • Updating Poedit repeats download when I press Space

    Updating Poedit repeats download when I press Space

    In Poedit 2.3.1, click File > Check for updates…:

    image

    Press Enter. The update file is downloaded:

    image

    Press Alt+Tab twice. The blue focus border around the button disappears. This is unexpected. See https://github.com/vslavik/poedit/issues/650.

    Press Space. The window closes. This is unexpected as well.

    Hmmm, some minutes ago, when I pressed Space, the download repeated, which was unexpected. Now the window closes, which is also unexpected.

    Ok, next try. Without getting distracted or doing any key press in-between:

    1. Click on File > Check for updates…
    2. Tab Tab Tab Tab Enter
    3. Wait until the download has finished
    4. Space

    These are very subtle differences. In this case, it really makes a difference whether I press a key or click using the mouse. I hope you can reproduce some of these edge cases.

    Windows 10.0.18362.959, Poedit 2.3.1.

    I won't install the update right now, just in case you want me to reproduce the above behavior once more. :)

    opened by rillig 1
Releases(v0.7.0)
Newton fractal in openframeworks, with shaders. (inspired by: 3b1b)

Newton-fractal Newton fractal in openframeworks, with shaders. (inspired by: 3b1b) Formula read more: Newton's method learn more: Newton's Fractal (wh

András Zoller 2 Nov 14, 2021
Organ-inspired VST3 plug-ins

MOrgan - "More than Organ" This is a small collection of open-source audio plug-ins inspired by the basic design of Hammond tone-wheel organs. These a

Shane Dunne 5 Dec 20, 2021
A Cross-Platform(Web, Android, iOS) app to Generate Faces of People (These people don't actually exist) made using Flutter.

?? ?? Flutter Random Face Generator A flutter app to generate random faces. The Generated faces do not actually exist in real life (in other words you

Aditya 63 Jun 25, 2022
TheMathU Similarity Index App will accept a mathematical problem as user input and return a list of similar problems that have memorandums.

Technologies MathU Similarity Index - Segmentation Cult The MathU Similarity Index App accepts a mathematical problem as user input and returns a list

COS 301 - 2022 5 Jun 13, 2022
TengineGst is a streaming media analytics framework, based on GStreamer multimedia framework, for creating varied complex media analytics pipelines.

TengineGst is a streaming media analytics framework, based on GStreamer multimedia framework, for creating varied complex media analytics pipelines. It ensures pipeline interoperability and provides optimized media, and inference operations using Tengine Toolkit Inference Engine backend, across varied architecture - CPU, iGPU and VPU.

OAID 64 May 30, 2022
An Open Source Machine Learning Framework for Everyone

Documentation TensorFlow is an end-to-end open source platform for machine learning. It has a comprehensive, flexible ecosystem of tools, libraries, a

null 166.1k Jul 1, 2022
header only, dependency-free deep learning framework in C++14

The project may be abandoned since the maintainer(s) are just looking to move on. In the case anyone is interested in continuing the project, let us k

tiny-dnn 5.5k Jun 22, 2022
OpenVSLAM: A Versatile Visual SLAM Framework

OpenVSLAM: A Versatile Visual SLAM Framework NOTE: This is a community fork of xdspacelab/openvslam. It was created to continue active development of

null 420 Jun 27, 2022
Caffe: a fast open framework for deep learning.

Caffe Caffe is a deep learning framework made with expression, speed, and modularity in mind. It is developed by Berkeley AI Research (BAIR)/The Berke

Berkeley Vision and Learning Center 32.7k Jul 1, 2022
A fast, distributed, high performance gradient boosting (GBT, GBDT, GBRT, GBM or MART) framework based on decision tree algorithms, used for ranking, classification and many other machine learning tasks.

Light Gradient Boosting Machine LightGBM is a gradient boosting framework that uses tree based learning algorithms. It is designed to be distributed a

Microsoft 13.9k Jun 30, 2022
CNStream is a streaming framework for building Cambricon machine learning pipelines

CNStream is a streaming framework for building Cambricon machine learning pipelines

Cambricon Technologies 170 Jun 15, 2022
Want a faster ML processor? Do it yourself! -- A framework for playing with custom opcodes to accelerate TensorFlow Lite for Microcontrollers (TFLM).

CFU Playground Want a faster ML processor? Do it yourself! This project provides a framework that an engineer, intern, or student can use to design an

Google 271 Jun 24, 2022
SecMML: Secure MPC(multi-party computation) Machine Learning Framework

SecMML 介绍 SecMML是FudanMPL(Multi-Party Computation + Machine Learning)的一个分支,是用于训练机器学习模型的高效可扩展的安全多方计算(MPC)框架,基于BGW协议实现。此框架可以应用到三个及以上参与方联合训练的场景中。目前,SecMM

null 74 Jun 27, 2022
A hierarchical parameter server framework based on MXNet. GeoMX also implements multiple communication-efficient strategies.

Introduction GeoMX is a MXNet-based two-layer parameter server framework, aiming at integrating data knowledge that owned by multiple independent part

null 86 Jun 1, 2022
TFCC is a C++ deep learning inference framework.

TFCC is a C++ deep learning inference framework.

Tencent 108 May 19, 2022
Inference framework for MoE layers based on TensorRT with Python binding

InfMoE Inference framework for MoE-based models, based on a TensorRT custom plugin named MoELayerPlugin (including Python binding) that can run infere

Shengqi Chen 29 May 10, 2022
KSAI Lite is a deep learning inference framework of kingsoft, based on tensorflow lite

KSAI Lite English | 简体中文 KSAI Lite是一个轻量级、灵活性强、高性能且易于扩展的深度学习推理框架,底层基于tensorflow lite,定位支持包括移动端、嵌入式以及服务器端在内的多硬件平台。 当前KSAI Lite已经应用在金山office内部业务中,并逐步支持金山

null 75 Apr 14, 2022
Benchmark framework of 3D integrated CIM accelerators for popular DNN inference, support both monolithic and heterogeneous 3D integration

3D+NeuroSim V1.0 The DNN+NeuroSim framework was developed by Prof. Shimeng Yu's group (Georgia Institute of Technology). The model is made publicly av

NeuroSim 10 Dec 21, 2021
Benchmark framework of compute-in-memory based accelerators for deep neural network (inference engine focused)

DNN+NeuroSim V1.3 The DNN+NeuroSim framework was developed by Prof. Shimeng Yu's group (Georgia Institute of Technology). The model is made publicly a

NeuroSim 20 Jun 1, 2022