Home

Awesome

Private Internet Access Desktop Client

This is the desktop client for the Private Internet Access VPN service. It consists of an unprivileged thin GUI client (the "client") and a privileged background service/daemon (the "daemon"). The daemon runs a single instance on the machine and is responsible for not only network configuration but also settings and account handling, talking to PIA servers as necessary. The client meanwhile runs in each active user's desktop and consists almost entirely of presentation logic. No matter how many users are active on a machine, they control the same single VPN instance and share a single PIA account.

The project uses Qt 6.2 for cross-platform development, both in the client and daemon. The client GUI is based on Qt Quick, which uses declarative markup language and JavaScript and offers hardware accelerated rendering when available. Qt and Qt Quick tend to be more memory and CPU efficient compared to web-based UI frameworks like Electron or NW.js.

Building and developing

The client is intended to be built on the target platform; Windows builds are built on Windows, macOS builds on macOS, and Linux builds on Debian.

The entire product is built using rake, using the supporting framework in the rake/ directory.

Dependencies such as OpenVPN and the Windows TAP driver are included as precompiled binaries under the deps directory in this project for convenience. To recompile any of these, please refer to their corresponding directories and/or repositories for build instructions.

Cloning the repository

Before cloning the Git repository, first make sure Git LFS is installed and initialized:

> git lfs version
git-lfs/2.3.4 (GitHub; windows amd64; go 1.8.3; git d2f6752f)

> git lfs install
Updated git hooks.
Git LFS initialized.

After this, cloning the repository normally should also fetch the precompiled binaries:

> git clone https://github.com/pia-foss/desktop.git
...
Filtering content: 100% (24/24), 17.13 MiB | 1.89 MiB/s, done.

Prerequisites

Running and debugging

Each platform requires additional installation steps in order for the client to be usable (e.g. the Windows TAP adapter needs to be installed).
The easiest way to perform these steps is to build and run an installer, after which you can stop and run individual executables in a debugger instead.

To debug your own daemon, the installed daemon must first be stopped:

The daemon must run as root. Consult your IDE/debugger documentation for how to safely run the debugger target as root.

Windows only:

To check PIA logs, go to your *installation_path*\data (The default path on Windows is C:\Program Files\Private Internet Access\data).
In order to enable all the logs, in PIA app Settings page go to Help and select Enable Debug Logging.

Quick start

Updating the built dependencies

Linux: check that the symbolic links are correct using ls -lah -R deps/built/linux/.
If they are not, create them using ln -sf libfile linkname.

Build system

The following targets can be passed to rake. The default target is stage, which stages the built client, daemon, and dependencies for local testing (but does not build installers, tests, etc.)

TargetExplanation
(default)Builds the client and daemon; stages executables with dependencies in out/pia_debug_x86_64/stage for local testing.
testBuilds and runs unit tests; produces code coverage artifacts if possible on the current platform (requires clang 6+)
installerBuilds the final installer artifact, including code signing if configured.
exportBuilds extra artifacts needed from CI but not part of any deployable artifact (currently translation exports)
libsBuilds the dtop libraries and development artifact (see DTOP-LIBS.md)
toolsBuilds extra tools for development purposes that are not used as part of the build process or as part of any shipped artifact.
artifactsBuilds all artifacts and copies to out/pia_debug_x86_64/artifacts (depends on most other targets, execpt test when coverage measurement isn't possible)
allAll targets.

Configurations

The build system has several properties that can be configured, either in the environment or by passing the appropriate variables to rake.

These are implemented in rake/build.rb. The output directory name includes the current brand, variant, and architecture.

VariableValuesDefaultExplanation
VARIANTdebug, releasedebugCreate a debug build (unoptimized, some compression levels reduced for speed), or release build (optimized, maximum compression).
ARCHITECTUREx86_64, x86, arm64, arm64e, armhf, universalHost architectureSelect an alternate architecture. Architecture support varies by platform.
PLATFORMwindows, macos, linux, android, ios, iossimHost platformSelect an alternate platform. Android and iOS targets only build core libraries and tests. Android builds can be performed from macOS or Linux hosts. iOS and iOS Simulator builds can be performed from macOS hosts.
BRAND(directories in brands/)piaBuild an alternate brand.

Variables

Some additional environment variables can be configured:

VariableExampleExplanation
QTROOT/opt/Qt/6.2.4Path to the installed Qt version, if qt.rb can't find it or you want to force a specific version

Mac installation

Installation on Mac uses SMJobBless to install a privileged helper that does the installation.

Mac OS requires the app to be signed in order to install and use the helper. If the app is not signed, it will not be able to install or uninstall itself (you can still install or uninstall manually by running the install script with sudo.)

PIA_CODESIGN_CERT must be set to the full common name of the certificate to sign with. (codesign allows a partial match, but the full CN is needed for various Info.plist files.)

To test installation, you can generate a self-signed certificate and sign with that.

Core Libraries

Note: building for android and ios is deprecated and unsupported at the time.

Some core libraries can be built targeting Android and iOS for use in our mobile clients.

Prerequisites

Building

Invoke rake with PLATFORM=android or PLATFORM=ios to target a mobile platform. You can also set ARCHITECTURE to one of arm64, armhf, x86_64, or x86 - the host architecture is the default. If you do this a lot, you can place overrides in your environment or .buildenv to use these by default.

(Qt does not need to be installed for mobile targets.)

Build system

The same rake-based build system is used, but the available targets differ.

TargetExplanation
(default)Stages core libraries with dependencies in out/pia_debug_<platform>_<arch>/dtop-libs for local testing.
libs_archiveBuilds the library SDK ZIP containing the built libraries and headers.
toolsBuilds libraries and internal test harnesses used to test them.
artifactsBuilds all artifacts and copies to out/pia_debug_<platform>_<arch>/artifacts (depends on most other targets)
allAll targets.

Automated testing

In the headless_tests directory you will find a suite of tests written in ruby with the help of RSpec. They use piactl in the background to manipulate the state of the daemon and run diverse tests. The advantage of testing in ruby is mainly simplicity, where doing things like calling API endpoints is much simpler than from C++ code.

With these almost end to end tests we hope to drastically reduce manual testing for releases to the point that we can release more frequently.

Use bundle install from the headless_tests directory to ensure you get all the dependencies.
Run the tests from within the headless_tests to pick up configuration in .rspec and spec_helper. Run all tests locally using bundle exec rspec ..

Windows

Add C:\Program Files\Private Internet Access to your user environment variable Path in order to be able to run piactl from the command line. (You can still run piactl using the full path, but the headless tests won't work).

Contributing

By contributing to this project you are agreeing to the terms stated in the Contributor License Agreement. For more details please see our Contribution Guidelines or CONTRIBUTING.

Licensing

Unless otherwise noted, original source code is licensed under the GPLv3. See LICENSE for more information.