mirror of
https://github.com/cryptoadvance/specter-desktop.git
synced 2026-08-13 12:33:29 +02:00
Electron Bug Fixes and Miscellaneous Changes (#2441)
* migrate the downloadpage generation script to this repo * tiny docs fix * fix 2 electron issues * support intel platform * fix save preferences bug
This commit is contained in:
parent
d58232c582
commit
5f05b9aa3b
18 changed files with 6194 additions and 60 deletions
|
|
@ -1,41 +1,55 @@
|
|||
# Release Guide
|
||||
|
||||
## Creating release notes
|
||||
|
||||
### Pre-requisites
|
||||
|
||||
- You need the correct upstream master. You should see
|
||||
```bash
|
||||
git remote -v | grep upstream
|
||||
|
||||
```bash
|
||||
git remote -v | grep upstream
|
||||
upstream git@github.com:cryptoadvance/specter-desktop.git (fetch)
|
||||
upstream git@github.com:cryptoadvance/specter-desktop.git (push)
|
||||
```
|
||||
|
||||
- You need a GitHub token:
|
||||
If you don't have one, get one here https://github.com/settings/tokens and make sure to tick the boxes for repo and workflow as below:
|
||||
If you don't have one, get one here https://github.com/settings/tokens and make sure to tick the boxes for repo and workflow as below:
|
||||
|
||||

|
||||
|
||||
Using the new token, run
|
||||
```bash
|
||||
export GH_TOKEN=YOURTOKEN
|
||||
```
|
||||
|
||||
```bash
|
||||
export GH_TOKEN=YOURTOKEN
|
||||
```
|
||||
|
||||
- You need Docker running
|
||||
- Checkout the master branch and ensure a clean workspace.
|
||||
|
||||
Now, you can run
|
||||
|
||||
```bash
|
||||
./utils/release.sh --release-notes
|
||||
```
|
||||
|
||||
Or, if you want to directly set the new version:
|
||||
|
||||
```bash
|
||||
./utils/release.sh --new-version v1.13.1 --release-notes
|
||||
```
|
||||
|
||||
## Creating a new tag
|
||||
|
||||
Update your master branch after the release notes PR ([example](https://github.com/cryptoadvance/specter-desktop/commit/65ff6959d7fd85cba745e4d454b30031839f857f/)) has been merged and then run:
|
||||
|
||||
```bash
|
||||
git tag v1.13.1 && git push upstream v1.13.1
|
||||
```
|
||||
|
||||
## GitLab - releasing stage
|
||||
Creating a tag triggers the release process of the GitLab runners.
|
||||
There exists a mirror of the GitHub repo on GitLab, but only when a tag is created on GitHub will the release part of the runners execute. You can check the status here:
|
||||
|
||||
Creating a tag triggers the release process of the GitLab runners.
|
||||
There exists a mirror of the GitHub repo on GitLab, but only when a tag is created on GitHub will the release part of the runners execute. You can check the status here:
|
||||
https://gitlab.com/cryptoadvance/specter-desktop/-/pipelines
|
||||
|
||||
There are three stages:
|
||||
|
|
@ -50,14 +64,17 @@ The first relevant stage is "releasing". Here, the Windows, Linux and pip releas
|
|||
- specter_desktop-v1.13.1-x86_64-linux-gnu.tar.gz
|
||||
|
||||
The three jobs in more detail:
|
||||
|
||||
- release_binary_windows: is creating a binary for specterd and for Windows (Windows runner)
|
||||
- release_electron_linux_windows: Creates a specterd for Linux, an AppImage for Linux and an executable for Windows (Linux runner).
|
||||
- release_pip: Is releasing a pypi package on [pypi](https://pypi.org/project/cryptoadvance.specter/) and creates a tarball of the pip package for the GitHub release page (Linux runner).
|
||||
- release_pip: Is releasing a pypi package on [pypi](https://pypi.org/project/cryptoadvance.specter/) and creates a tarball of the pip package for the GitHub release page (Linux runner).
|
||||
|
||||
For details look at `.gitlab-ci.yml`
|
||||
|
||||
## MacOS
|
||||
|
||||
Ideally, directly after the tag is created, start with the MacOS release. This has to be done manually, for now. There is a script for this:
|
||||
|
||||
```bash
|
||||
./utils/build-osx.sh --version v1.13.1 --appleid "Satoshi Nakamoto (appleid)" --mail "satoshi@gmx.com" make-hash specterd electron sign upload
|
||||
```
|
||||
|
|
@ -70,9 +87,11 @@ This script also runs `github.py upload `, so two more binares and the hash and
|
|||
- SHA256SUMS-macos.asc
|
||||
|
||||
## GitLab - post releasing
|
||||
Back to GitLab, the final stage is "post releasing".
|
||||
|
||||
Back to GitLab, the final stage is "post releasing".
|
||||
|
||||
In this stage, the invididual SHA256-hashes and signatures are combined into two final files:
|
||||
|
||||
- SHA256SUMS
|
||||
- SHA256SUMS.asc
|
||||
|
||||
|
|
@ -80,44 +99,25 @@ Everything, apart from the MacOS files, are pulled from the GitLab environment,
|
|||
Don't forget to delete the two MacOS files (`SHA256SUMS-macos` and `SHA256SUMS-macos.asc`) on the GitHub release page in the end.
|
||||
|
||||
## Trouble shooting
|
||||
|
||||
If the MacOS signatures are missing, it can happen that the following Exception will be raised:
|
||||
|
||||
```bash
|
||||
File "/builds/cryptoadvance/specter-desktop/utils/github.py", line 295, in download_artifact
|
||||
raise Exception(
|
||||
Exception: Status-cod04 for url ... )
|
||||
```
|
||||
|
||||
In any case, if the macOS binaries arrive on GitHub too late, you have to manually delete the already created `SHA256SUMS` and `SHA256SUMS.asc`, otherwise the upload to GitHub will fail if you rerun the release signatures job on GitLab - for details see ([this PR](https://github.com/cryptoadvance/specter-desktop/pull/689)). The green arrow in the screenshot is where you rerun the release signatures job on GitLab:
|
||||
|
||||

|
||||
|
||||
## Editing the text on the GitHub release page
|
||||
We are running a script here to create a markdown file that can be used for copy and paste. The script uses the latest release on GitHub to create links to the artifacts in the release, so it only makes sense to run it once the previous step has been completed.
|
||||
- Checkout this repo: `git@github.com:cryptoadvance/corp-notes.git`
|
||||
- `cd download-page`
|
||||
- Run `./build.sh`
|
||||
## GitHub release page and download page
|
||||
|
||||
The result `gh_page.md` can be found in the build directory.
|
||||
Edit the release on GitHub and paste the md-file there along with the release notes from `release-notes.md`.
|
||||
|
||||
## Website
|
||||
The above script also produces html files for the website (in the same directory). The second item needs to have the release notes on GitHub, otherwise the content for the details button is missing. So, you need to re-run `./build.sh` after the release notes on GitHub are done.
|
||||
- `download-page_current.html`
|
||||
- `download-page_releases.html`
|
||||
|
||||
Login into: https://specter.solutions/wp-login.php
|
||||
|
||||
- Go to "Pages"
|
||||
- Hover over "Specter Desktop - Elementor" and choose `Edit with Elementor`
|
||||
- Click somewhere on area 1 (see screenshot), then somewhere on area 2, select all, delete, and paste: `download-page_current.html`
|
||||
|
||||
\
|
||||
- Then click `update`
|
||||
Note: If you see jinja tags, you probably pasted some templates.
|
||||
|
||||
Do the same for the "Specter Releases" part, just, in this case, replace with:\
|
||||
`download-page_releases.html`
|
||||
|
||||
\
|
||||
|
||||
You can then just exit the editing with Elementor.
|
||||
This is handled by the script `./utils/generate_downloadpage.sh`. As a prerequisite, you need to clone the `specter-static` repo which contains the specter website. Clone it on the same level than specter-desktop.
|
||||
Running that script will:
|
||||
|
||||
- install the prerequisites (basically markdown, see pyproject.toml)
|
||||
- generate the GH-page and the download-page based on the `utils/templates`.
|
||||
- Asks whether it should replace/update/initialize the Github Release page for the latest version
|
||||
- copies over the new download-pages and asks whether it should commit/push those
|
||||
|
|
|
|||
|
|
@ -1,22 +1,23 @@
|
|||
# SSL Certificate
|
||||
|
||||
## Why a certificate is important
|
||||
|
||||
Browsers require secure communication with the server to use camera API. Without it we can't use QR code scanning.
|
||||
|
||||
If you are running a VPS it's easy - you just [issue a new certificate](./reverse-proxy#adding-https) with Letsencrypt.
|
||||
If you are running a VPS it's easy - you just [issue a new certificate](./reverse-proxy.md#adding-https) with Letsencrypt.
|
||||
|
||||
If you are only using the node at home and want to use it from your local network and via camera, you need to run it via SSL.
|
||||
|
||||
## Easy solution
|
||||
|
||||
The easiest solution is to simply add `--ssl` to the serve-command and the certificate will get created automatically in the specter-home-folder.
|
||||
|
||||
```
|
||||
python3 -m cryptoadance.specter server --ssl
|
||||
```
|
||||
|
||||
## Manual creation
|
||||
|
||||
|
||||
A second way, which provides more customization, is to run the [`gen-certificate.sh`](gen-certificate.sh) script in this folder with your node's IP address as an argument:
|
||||
|
||||
```sh
|
||||
|
|
@ -33,7 +34,7 @@ Provide these files to Specter as arguments:
|
|||
python -m cryptoadvance.specter server --cert=./cert.pem --key=./key.pem
|
||||
```
|
||||
|
||||
*Note:* Adding `--tor=your-tor-password` will create a tor hidden service with https.
|
||||
_Note:_ Adding `--tor=your-tor-password` will create a tor hidden service with https.
|
||||
|
||||
### Specter with Nginx
|
||||
|
||||
|
|
@ -53,7 +54,7 @@ The config should look like this:
|
|||
server{
|
||||
listen 80 default_server;
|
||||
listen 443 ssl http2;
|
||||
|
||||
|
||||
server_name your_domain_or_ip;
|
||||
|
||||
ssl_certificate /etc/ssl/certs/cert.pem;
|
||||
|
|
|
|||
|
|
@ -33,8 +33,9 @@
|
|||
const fs = require('fs')
|
||||
const { ipcRenderer } = require('electron')
|
||||
const helpers = require('./helpers')
|
||||
const getAppSettings = helpers.getAppSettings
|
||||
const appSettingsPath = helpers.appSettingsPath
|
||||
const config = require('./config')
|
||||
const getAppSettings = config.getAppSettings
|
||||
const appSettingsPath = config.appSettingsPath
|
||||
|
||||
function cancel() {
|
||||
window.close();
|
||||
|
|
|
|||
|
|
@ -8,10 +8,11 @@ const contextMenu = require('electron-context-menu')
|
|||
const { appSettingsPath, specterdDirPath, appSettings, platformName, appNameLower } = require('./src/config.js')
|
||||
const { logger } = require('./src/logging.js')
|
||||
const downloadloc = require('./downloadloc')
|
||||
const { downloadSpecterd } = require('./src/download.js')
|
||||
const { downloadSpecterd, destroyProgressbar } = require('./src/download.js')
|
||||
const getDownloadLocation = downloadloc.getDownloadLocation
|
||||
const { startSpecterd, quitSpecterd } = require('./src/specterd.js')
|
||||
const { getFileHash, getAppSettings, versionData, isDev, devFolder, isMac } = require('./src/helpers.js')
|
||||
const { getFileHash, versionData, isDev, devFolder, isMac } = require('./src/helpers.js')
|
||||
const { getAppSettings } = require('./src/config.js')
|
||||
const { showError, updatingLoaderMsg, initMainWindow, loadUrl, initTray } = require('./src/uiHelpers.js')
|
||||
|
||||
// Quit again if there is no version-data in dev
|
||||
|
|
@ -191,13 +192,7 @@ app.on('before-quit', (event) => {
|
|||
quitted = true
|
||||
quitSpecterd()
|
||||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||||
if (progressBar) {
|
||||
// You can only destroy the progress bar if it hadn't been closed before
|
||||
if (progressBar.browserWindow) {
|
||||
progressBar.destroy()
|
||||
}
|
||||
progressBar = null
|
||||
}
|
||||
destroyProgressbar()
|
||||
mainWindow.destroy()
|
||||
mainWindow = null
|
||||
prefWindow = null
|
||||
|
|
|
|||
|
|
@ -32,7 +32,15 @@
|
|||
"entitlements": "./build/entitlements.mac.plist",
|
||||
"hardenedRuntime": true,
|
||||
"icon": "./icons/icon.icns",
|
||||
"provisioningProfile": "/Users/kim/Specter_Desktop_vanilla.provisionprofile"
|
||||
"provisioningProfile": "/Users/kim/Specter_Desktop_vanilla.provisionprofile",
|
||||
"target": [
|
||||
{
|
||||
"target": "dmg",
|
||||
"arch": [
|
||||
"universal"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"win": {
|
||||
"icon": "./icons/icon.ico"
|
||||
|
|
|
|||
|
|
@ -115,10 +115,11 @@
|
|||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const { ipcRenderer } = require("electron");
|
||||
const helpers = require("./helpers");
|
||||
const helpers = require("./src/helpers");
|
||||
const config = require("./src/config");
|
||||
const getFileHash = helpers.getFileHash;
|
||||
const getAppSettings = helpers.getAppSettings;
|
||||
const appSettingsPath = helpers.appSettingsPath;
|
||||
const getAppSettings = config.getAppSettings;
|
||||
const appSettingsPath = config.appSettingsPath;
|
||||
const specterdDirPath = helpers.specterdDirPath;
|
||||
|
||||
function toggleAdvanced() {
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ module.exports = {
|
|||
specterAppLogPath,
|
||||
versionDataPath,
|
||||
versionData,
|
||||
getAppSettings,
|
||||
isDev: isDev,
|
||||
devFolder,
|
||||
}
|
||||
|
|
@ -10,6 +10,8 @@ const ProgressBar = require('electron-progressbar')
|
|||
const { updateSpecterdStatus, updatingLoaderMsg, createProgressBar } = require('./uiHelpers.js')
|
||||
const { startSpecterd } = require('./specterd.js')
|
||||
|
||||
let progressBar
|
||||
|
||||
// The standard quit item cannot be replaced / modified and it is not triggering the
|
||||
// before-quit event on MacOS if a child window is open
|
||||
const dockMenuWithforceQuit = Menu.buildFromTemplate([
|
||||
|
|
@ -85,7 +87,7 @@ const download = (uri, filename, callback) => {
|
|||
let receivedBytes = 0
|
||||
const totalBytes = res.headers['content-length']
|
||||
logger.info(`Total size to download: ${totalBytes}`)
|
||||
const progressBar = createProgressBar(totalBytes)
|
||||
progressBar = createProgressBar(totalBytes)
|
||||
// Add Force Quit item during download for MacOS dock
|
||||
if (isMac) {
|
||||
app.dock.setMenu(dockMenuWithforceQuit)
|
||||
|
|
@ -139,7 +141,18 @@ const download = (uri, filename, callback) => {
|
|||
})
|
||||
}
|
||||
|
||||
const destroyProgressbar = () => {
|
||||
if (progressBar) {
|
||||
// You can only destroy the progress bar if it hadn't been closed before
|
||||
if (progressBar.browserWindow) {
|
||||
progressBar.destroy()
|
||||
}
|
||||
progressBar = null
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
downloadSpecterd: downloadSpecterd,
|
||||
download: download,
|
||||
destroyProgressbar,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ const crypto = require('crypto')
|
|||
const readLastLines = require('read-last-lines')
|
||||
const isMac = process.platform === 'darwin'
|
||||
|
||||
const { versionData, appSettingsPath, specterAppLogPath } = require('./config.js')
|
||||
const { versionData, specterAppLogPath } = require('./config.js')
|
||||
const { logger } = require('./logging.js')
|
||||
|
||||
// Use different version-data.jsons
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ const { logger } = require('./logging')
|
|||
const { appSettings, isDev, platformName } = require('./config')
|
||||
const ProgressBar = require('electron-progressbar')
|
||||
const { isMac } = require('./helpers')
|
||||
const { shell } = require('electron')
|
||||
|
||||
// Initialized with initMainWindow
|
||||
let mainWindow
|
||||
|
|
|
|||
|
|
@ -85,4 +85,8 @@ test = [
|
|||
"python-gitlab==2.10.1",
|
||||
# requirements for stuff in ./utils
|
||||
"requests==2.26.0",
|
||||
]
|
||||
|
||||
gendownloadpage = [
|
||||
"markdown==3.3.7"
|
||||
]
|
||||
134
utils/generate_downloadpage.py
Normal file
134
utils/generate_downloadpage.py
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
import datetime
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
import sys
|
||||
|
||||
import markdown
|
||||
import requests
|
||||
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
||||
from jinja2.utils import markupsafe
|
||||
|
||||
|
||||
stoh = logging.StreamHandler(sys.stderr)
|
||||
fmth = logging.Formatter("[%(levelname)s] %(asctime)s %(message)s")
|
||||
stoh.setFormatter(fmth)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.addHandler(stoh)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
|
||||
def website():
|
||||
"""generates the two snippets for the website"""
|
||||
md = markdown.Markdown(extensions=["meta"])
|
||||
env = Environment(
|
||||
loader=FileSystemLoader("./templates"),
|
||||
autoescape=select_autoescape(["html", "xml"]),
|
||||
)
|
||||
env.filters["markdown"] = lambda text: markupsafe.Markup(md.convert(text))
|
||||
env.globals["get_title"] = lambda: md.Meta["title"][0]
|
||||
env.trim_blocks = True
|
||||
env.lstrip_blocks = True
|
||||
date = None
|
||||
headers = {"Accept": "application/vnd.github.v3+json"}
|
||||
data = json.loads(
|
||||
requests.get(
|
||||
"https://api.github.com/repos/cryptoadvance/specter-desktop/releases",
|
||||
headers=headers,
|
||||
).text
|
||||
)
|
||||
# Some time-conversion to make formating easier in jinja2
|
||||
logger.info(f" --> preprocessing all releases")
|
||||
pre_release_pattern = re.compile(".*-pre[0-9]") # -(pre)|(dev)[0-9]
|
||||
for idx, release in enumerate(data):
|
||||
logger.info(f" processing {release['name']}")
|
||||
if pre_release_pattern.match(release["name"]):
|
||||
logger.info(f" marking {release['name']} as pre-release")
|
||||
release["is_pre_release"] = True
|
||||
else:
|
||||
release["published_at"] = datetime.datetime.strptime(
|
||||
release["published_at"], "%Y-%m-%dT%H:%M:%SZ"
|
||||
)
|
||||
|
||||
current = data[0]
|
||||
current["assets_by_os"] = {
|
||||
"macos": "not_existing",
|
||||
"linux": "not_existing",
|
||||
"win": "not_existing",
|
||||
}
|
||||
logger.info(f" --> preprocessing current release")
|
||||
for asset in current["assets"]:
|
||||
logger.info(f" processing {asset['name']}")
|
||||
if asset["browser_download_url"].endswith(".exe"):
|
||||
current["assets_by_os"]["win"] = asset
|
||||
logger.info(f" Found win for {asset['name']}")
|
||||
if asset["browser_download_url"].endswith(".dmg"):
|
||||
current["assets_by_os"]["macos"] = asset
|
||||
logger.info(f" Found macos for {asset['name']}")
|
||||
if asset["browser_download_url"].endswith(".tar.gz") and asset[
|
||||
"name"
|
||||
].startswith("specter_desktop"):
|
||||
current["assets_by_os"]["linux"] = asset
|
||||
logger.info(f" Found linux for {asset['name']}")
|
||||
if asset["browser_download_url"].endswith("SHA256SUMS.asc"):
|
||||
current["signatures"] = asset
|
||||
logger.info(f" Found signatures")
|
||||
if asset["browser_download_url"].endswith("SHA256SUMS"):
|
||||
current["hashes"] = asset
|
||||
logger.info(f" Found hashes")
|
||||
template = env.get_template("download-page_current.html")
|
||||
with open("build/download-page_current.html", "w") as f:
|
||||
f.write(template.render(data=data, current=data[0]))
|
||||
template = env.get_template("download-page_releases.html")
|
||||
# print(data)
|
||||
with open("build/download-page_releases.html", "w") as f:
|
||||
f.write(template.render(data=data, current=data[0]))
|
||||
|
||||
# download_page final
|
||||
template = env.get_template("download-page.html")
|
||||
with open("build/download-page.html", "w") as f:
|
||||
f.write(template.render(data=data, current=data[0]))
|
||||
|
||||
|
||||
def gh_release_notes(latest_release):
|
||||
env = Environment(loader=FileSystemLoader("./templates"))
|
||||
template = env.get_template("gh_release-page-v2.md")
|
||||
data = {"version": latest_release, "release_notes": ""}
|
||||
rn_file = requests.get(
|
||||
"https://raw.githubusercontent.com/cryptoadvance/specter-desktop/master/docs/release-notes.md"
|
||||
).text.split("\n")
|
||||
logger.info(" --> Creating Release")
|
||||
status = "search"
|
||||
release_item_counter = 0
|
||||
for line in rn_file:
|
||||
if status == "search" and line.startswith("##"):
|
||||
status = "harvest"
|
||||
continue
|
||||
if status == "harvest" and not line.strip():
|
||||
break
|
||||
if status == "search":
|
||||
continue
|
||||
|
||||
data["release_notes"] = data["release_notes"] + line + "\n"
|
||||
release_item_counter = release_item_counter + 1
|
||||
|
||||
logger.info(f" {release_item_counter} items added to release_notes")
|
||||
|
||||
print(line)
|
||||
with open("build/gh_page.md", "w") as f:
|
||||
f.write(template.render(data=data))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
headers = {"Accept": "application/vnd.github.v3+json"}
|
||||
latest_release = json.loads(
|
||||
requests.get(
|
||||
"https://api.github.com/repos/cryptoadvance/specter-desktop/releases/latest",
|
||||
headers=headers,
|
||||
).text
|
||||
)
|
||||
latest_release = latest_release["name"]
|
||||
logger.info(latest_release)
|
||||
website()
|
||||
gh_release_notes(latest_release)
|
||||
66
utils/generate_downloadpage.sh
Executable file
66
utils/generate_downloadpage.sh
Executable file
|
|
@ -0,0 +1,66 @@
|
|||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
# We start in the directory where this script is located
|
||||
cd "$(dirname "${BASH_SOURCE[0]}")/."
|
||||
source ../.env/bin/activate
|
||||
cd .. && pip3 install -e ".[gendownloadpage]" && cd utils
|
||||
rm -rf build
|
||||
mkdir -p build
|
||||
python3 ./generate_downloadpage.py
|
||||
|
||||
# Update Github Release Page
|
||||
latest_release=$(python3 -c 'import json; import requests; ver = json.loads(requests.get("https://api.github.com/repos/cryptoadvance/specter-desktop/releases/latest", headers={"Accept": "application/vnd.github.v3+json"}).text)["name"]; print(ver)')
|
||||
|
||||
if ! command -v gh &> /dev/null; then
|
||||
echo "WARNING: 'gh' binary not found or not executable. Please ensure it is installed and in your PATH."
|
||||
echo "You need now to manually replace the release-Notes. I'll list them here:"
|
||||
echo "------(snip)-->-8---(snap)--8-<-------------"
|
||||
cat build/gh_page.md
|
||||
echo "------(snip)-->-8---(snap)--8-<-------------"
|
||||
read -p "Press a button to continue when you've done it ..."
|
||||
else
|
||||
read -p "Update the Github Release page for version $latest_release ? (y/n): " confirm
|
||||
if [[ $confirm =~ ^[Yy]$ ]]; then
|
||||
gh release edit $latest_release --repo cryptoadvance/specter-desktop --notes-file build/gh_page.md
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if ! [[ -d ../../specter-static ]]; then
|
||||
echo "You don't have cloned the specter-static repo."
|
||||
echo "Go and clone it and then run this script again!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cp build/download-page.html ../../specter-static/specter-httrack-src/specter.solutions/downloads/index.html
|
||||
|
||||
# Change to the Git working directory
|
||||
cd ../../specter-static
|
||||
|
||||
# Check if working directory is clean
|
||||
if git diff --quiet && git diff --staged --quiet; then
|
||||
echo "Git working directory is clean. Exiting..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Add the file to the staging area
|
||||
git add specter-httrack-src/specter.solutions/downloads/index.html
|
||||
|
||||
# Commit the changes
|
||||
read -p "Commit changes? (y/n): " confirm
|
||||
if [[ $confirm =~ ^[Yy]$ ]]; then
|
||||
git commit -m "Update specter.solutions/downloads/index.html"
|
||||
else
|
||||
echo "Commit aborted."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Push the commit
|
||||
read -p "Push commit to remote? (y/n): " confirm
|
||||
if [[ $confirm =~ ^[Yy]$ ]]; then
|
||||
git push
|
||||
else
|
||||
echo "Push aborted."
|
||||
exit 1
|
||||
fi
|
||||
5289
utils/templates/download-page.html
Normal file
5289
utils/templates/download-page.html
Normal file
File diff suppressed because one or more lines are too long
426
utils/templates/download-page_current.html
Normal file
426
utils/templates/download-page_current.html
Normal file
|
|
@ -0,0 +1,426 @@
|
|||
<html>
|
||||
|
||||
<style>
|
||||
/*CURRENT SECTION*/
|
||||
.current {
|
||||
background-color: #293142;
|
||||
border-radius: 5px;
|
||||
padding: 55px 25px;
|
||||
margin-bottom: 30px;
|
||||
width: 80%;
|
||||
position: relative;
|
||||
left: 10%;
|
||||
}
|
||||
.current ul {
|
||||
list-style-type: none;
|
||||
margin-left: 0;
|
||||
margin-bottom: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.current ul li {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
}
|
||||
.current ul li a.btn {
|
||||
border-style: solid;
|
||||
border: none;
|
||||
color: #ffffff;
|
||||
border-color: #289db8;
|
||||
background-color: #289db8;
|
||||
border-radius: 5px;
|
||||
padding: 13px 40px;
|
||||
font-family: inherit;
|
||||
font-weight: 500;
|
||||
font-size: 1rem;
|
||||
line-height: 1;
|
||||
}
|
||||
.current ul li a.btn:hover {
|
||||
background-color: #46B2CB;
|
||||
}
|
||||
.current ul li a .fab {
|
||||
font-size: 60px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
.current ul li a .fab:hover {
|
||||
color: #289db8;
|
||||
}
|
||||
.current .open-source {
|
||||
margin-bottom: 0;
|
||||
margin-top: 70px;
|
||||
text-align: center;
|
||||
font-size: 12px;
|
||||
color: #ffffff;
|
||||
}
|
||||
.popup {
|
||||
position: fixed;
|
||||
top: 15vh;
|
||||
left: 10vw;
|
||||
z-index: 1;
|
||||
width: 80vw;
|
||||
height: 80vh;
|
||||
min-height: 600px;
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
transition: visibility 300ms, opacity 300ms;
|
||||
}
|
||||
.popup_opened {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
}
|
||||
.popup__container {
|
||||
background-color: #0b0f15;
|
||||
text-align: left;
|
||||
margin: auto;
|
||||
position: relative;
|
||||
overflow: scroll;
|
||||
height: 100%;
|
||||
padding: 40px;
|
||||
border-radius: 5px;
|
||||
border: 20px solid #0b0f15;
|
||||
border-bottom: 40px solid #0b0f15;
|
||||
box-shadow: 0px 0px 25px rgba(255,255,255,0.1);
|
||||
}
|
||||
.popup__container ul.verify-list {
|
||||
display: block;
|
||||
}
|
||||
.popup__container ul.verify-list li {
|
||||
text-align: left;
|
||||
display: block;
|
||||
}
|
||||
.popup__container ul.verify-list li a {
|
||||
color: #289db8;
|
||||
}
|
||||
.popup__container ul.verify-list li img {
|
||||
width: 100%;
|
||||
border: 1px solid rgba(255,255,255,0.2);
|
||||
border-radius: 5px;
|
||||
margin: 10px 0;
|
||||
}
|
||||
.popup__container .code-display {
|
||||
background-color: #293142;
|
||||
padding: 10px 20px;
|
||||
border-radius: 5px;
|
||||
line-height: 30px;
|
||||
margin: 10px;
|
||||
font-size: 14px;
|
||||
display: inline-block !important;
|
||||
}
|
||||
.close-button {
|
||||
border: 0;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 10px;
|
||||
fill: #000;
|
||||
padding: 0;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
z-index: 10;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.close-button span {
|
||||
display: block;
|
||||
position: absolute;
|
||||
width: 18px;
|
||||
height: 3px;
|
||||
border-radius: 4px;
|
||||
background-color: #000;
|
||||
transform: rotate(-45deg);
|
||||
left: 6px;
|
||||
top: 14px;
|
||||
}
|
||||
.close-button span.last {
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.popup-button {
|
||||
margin-top: 14px;
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
}
|
||||
.popup-button:hover {
|
||||
color: #289db8;
|
||||
}
|
||||
@media only screen and (max-width: 790px) {
|
||||
.current {
|
||||
width: 100%;
|
||||
left: 0;
|
||||
}
|
||||
.current ul {
|
||||
display: block;
|
||||
}
|
||||
.current ul li {
|
||||
display: block;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
.popup__container {
|
||||
padding: 40px 20px;
|
||||
}
|
||||
}
|
||||
|
||||
/*LIST SECTION*/
|
||||
/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
|
||||
.collapsible.active {
|
||||
background-color: #293142 !important;
|
||||
border-radius: 5px 5px 0px 0px !important;
|
||||
}
|
||||
/* Style the collapsible content. Note: hidden by default */
|
||||
.release-content {
|
||||
padding: 30px 18px;
|
||||
display: none;
|
||||
overflow: hidden;
|
||||
background-color: #293142;
|
||||
border-radius: 0px 5px 5px 5px;
|
||||
}
|
||||
h2.releases {
|
||||
font-size: 40px;
|
||||
}
|
||||
h3.release-title {
|
||||
margin-top: 40px;
|
||||
padding-top: 40px;
|
||||
border-top: 1px solid rgba(255,255,255,0.3);
|
||||
position: relative;
|
||||
text-transform: none;
|
||||
font-size: 30px;
|
||||
}
|
||||
h3.release-title .latest {
|
||||
background-color: #10ac84;
|
||||
color: #222222;
|
||||
border: 1px solid #10ac84;
|
||||
padding: 1px 7px;
|
||||
border-radius: 20px;
|
||||
font-size: 8px;
|
||||
text-transform: uppercase;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
position: relative;
|
||||
bottom: 4px;
|
||||
font-weight: 700;
|
||||
display: inline-block;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
.release-content h1, .release-content h2 {
|
||||
font-size: 20px;
|
||||
text-transform: none;
|
||||
}
|
||||
.release-content p, .release-content ul li {
|
||||
font-size: 14px;
|
||||
}
|
||||
.assets li a {
|
||||
margin-left: 15px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.assets li a .fas {
|
||||
margin-right: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.date {
|
||||
color: rgb(40, 157, 184);
|
||||
margin-bottom: 15px;
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
}
|
||||
.assets {
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
border-radius: 5px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.assets h4 {
|
||||
margin-bottom: 0;
|
||||
|
||||
}
|
||||
.assets ul {
|
||||
list-style-type: none;
|
||||
margin-left: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.assets ul li {
|
||||
line-height: 40px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
.assets ul li:last-child {
|
||||
line-height: 40px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0);
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="current">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="{{current.assets_by_os.macos.browser_download_url}}">
|
||||
<i class="fab fa-apple"></i></a>
|
||||
<br><br>
|
||||
<a class="btn" href="{{current.assets_by_os.macos.browser_download_url}}">For OS X</a><br>
|
||||
<div class="popup mac">
|
||||
<button type="button" class="close-button">
|
||||
<span></span>
|
||||
<span class="last"></span>
|
||||
</button>
|
||||
<div class="popup__container">
|
||||
<h3>Mac OS Signature Verification</h3>
|
||||
<ul class="verify-list">
|
||||
<li>1. Download Specter for macOS (`<a href="{{current.assets_by_os.macos.browser_download_url}}">{{current.assets_by_os.macos.name}}</a>`), the hashfile (`<a href="{{current.hashes.browser_download_url}}">SHA256SUMS</a>`) and the signatures file (`<a href="{{current.signatures.browser_download_url}}">SHA256SUMS.asc</a>`)</li>
|
||||
<li>2. Download and import the PGP Public key of "Specter Signer" here <a href="http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7">here.</a> The fingerprint for this key is 785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7.</li>
|
||||
<li>2b. Download and import the PGP Public key of Kim Neunert (for v1.7.0): <a href="https://keybase.io/k9ert/pgp_keys.asc?fingerprint=ecc0b4abd74e716f5ade095228b358a8843b0109">https://keybase.io/k9ert/pgp_keys.asc</a></li>
|
||||
<li>2c. For older releases, download and save the PGP public key of Ben Kaufman: <a href="https://benkaufman.info/ben-kaufman.asc">https://benkaufman.info/ben-kaufman.asc</a></li>
|
||||
<li>3. Open the terminal app (you can search for it on the Launchpad)</li>
|
||||
<li>4. Paste in the following lines (Note: The first 2 commands are needed only if it’s your first time doing this process):</li>
|
||||
<li class="code-display">
|
||||
1. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"<br>
|
||||
2. brew install gnupg<br>
|
||||
3. cd Downloads<br>
|
||||
4. gpg --import pgp_keys.asc<br>
|
||||
5. gpg --verify SHA256SUMS.asc<br>
|
||||
</li>
|
||||
<li>5. After the last command, you should see a few lines of output - make sure they contain “Good signature” and the key identity and fingerprint are correct.</li>
|
||||
<li><img src="https://specter.solutions/wp-content/uploads/2021/10/good_sig.png" width="100%"></li>
|
||||
<li>6. Verify the sha256 of the Specter software file is indeed in the signed hashes file by running:</li>
|
||||
<li class="code-display">
|
||||
sha256sum -c SHA256SUMS --ignore-missing {{current.assets_by_os.macos.name}}<br>
|
||||
</li>
|
||||
<li>7. Make sure the output shows “OK” next to the file name, like this:</li>
|
||||
<li><img src="https://specter.solutions/wp-content/uploads/2021/10/file_ok.png" width="100%"></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<span class="popup-button mac"><i class="fas fa-info-circle"></i> Verify signature</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{current.assets_by_os.win.browser_download_url}}">
|
||||
<i class="fab fa-windows"></i></a>
|
||||
<br><br>
|
||||
<a class="btn" href="{{current.assets_by_os.win.browser_download_url}}">For Windows</a><br>
|
||||
<div class="popup windows">
|
||||
<button type="button" class="close-button">
|
||||
<span></span>
|
||||
<span class="last"></span>
|
||||
</button>
|
||||
<div class="popup__container">
|
||||
<h3>Windows Signature Verification</h3>
|
||||
<ul class="verify-list">
|
||||
<li>1. Download Specter for Windows (`<a href="{{current.assets_by_os.win.browser_download_url}}">{{current.assets_by_os.win.name}}</a>`), the hashfile (`<a href="{{current.hashes.browser_download_url}}">SHA256SUMS</a>`) and the signatures file (`<a href="{{current.signatures.browser_download_url}}">SHA256SUMS.asc</a>`)</li>
|
||||
<li>2. Download and import the PGP Public key of "Specter Signer" here <a href="http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7">here.</a> The fingerprint for this key is 785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7.</li>
|
||||
<li>2b. Download and import the PGP Public key of Kim Neunert (for v1.7.0): <a href="https://keybase.io/k9ert/pgp_keys.asc?fingerprint=ecc0b4abd74e716f5ade095228b358a8843b0109">https://keybase.io/k9ert/pgp_keys.asc</a></li>
|
||||
<li>2c. For older releases, download and save the PGP public key of Ben Kaufman: <a href="https://benkaufman.info/ben-kaufman.asc">https://benkaufman.info/ben-kaufman.asc</a></li>
|
||||
<li>3. Download and install <a href="https://files.gpg4win.org/gpg4win-3.1.15.exe">Gpg4Win</a> (you can get it directly here)</li>
|
||||
<li>4. Wait for it to open up or open Kleopatra from the Windows search bar</li>
|
||||
<li>5. Click “Import on the main screen and choose the pgp_keys.asc key you have downloaded in step 2</li>
|
||||
<li>6. Click Decrypt/Verify on the upper bar and select the SHA256SUMS.asc file downloaded in step 1</li>
|
||||
<li>7. Make sure verification passes successfully and returned the key you have imported as the signer of the file</li>
|
||||
<li>8. Right click on the Windows button and choose PowerShell</li>
|
||||
<li>9. In the PowerShell terminal, type:</li>
|
||||
<li class="code-display">
|
||||
1. cd Downloads<br>
|
||||
2. Get-FileHash {{current.assets_by_os.win.name}}<br>
|
||||
</li>
|
||||
<li>10. Open the SHA256SUMS file</li>
|
||||
<li>11. Verify the result of the hash from the PowerShell matches the hash that is aligned with the name of the file written inside SHA256SUMS</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<span class="popup-button windows"><i class="fas fa-info-circle"></i> Verify signature</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{current.assets_by_os.linux.browser_download_url}}">
|
||||
<i class="fab fa-linux"></i></a>
|
||||
<br><br>
|
||||
<a class="btn" href="{{current.assets_by_os.linux.browser_download_url}}">For Linux</a><br>
|
||||
<div class="popup linux">
|
||||
<button type="button" class="close-button">
|
||||
<span></span>
|
||||
<span class="last"></span>
|
||||
</button>
|
||||
<div class="popup__container">
|
||||
<h3>Linux Signature Verification</h3>
|
||||
<ul class="verify-list">
|
||||
<li>1. Download Specter for Linux (`<a href="{{current.assets_by_os.linux.browser_download_url}}">{{current.assets_by_os.linux.name}}</a>`), the hashfile (`<a href="{{current.hashes.browser_download_url}}">SHA256SUMS</a>`) and the signatures file (`<a href="{{current.signatures.browser_download_url}}">SHA256SUMS.asc</a>`)</li>
|
||||
<li>2. Download and import the PGP Public key of "Specter Signer" here <a href="http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7">here.</a> The fingerprint for this key is 785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7.</li>
|
||||
<li>2b. Download and import the PGP Public key of Kim Neunert (for v1.7.0): <a href="https://keybase.io/k9ert/pgp_keys.asc?fingerprint=ecc0b4abd74e716f5ade095228b358a8843b0109">https://keybase.io/k9ert/pgp_keys.asc</a></li>
|
||||
<li>2c. For older releases, download and save the PGP public key of Ben Kaufman: <a href="https://benkaufman.info/ben-kaufman.asc">https://benkaufman.info/ben-kaufman.asc</a></li>
|
||||
<li>3. Open the terminal app (you can search for it on the Launchpad)</li>
|
||||
<li>4. Paste in the following lines (Note: The first 2 commands are needed only if it’s your first time doing this process):</li>
|
||||
<li class="code-display">
|
||||
1. sudo apt update<br>
|
||||
2. sudo apt-get install gnupg<br>
|
||||
3. cd Downloads<br>
|
||||
4. gpg --import pgp_keys.asc<br>
|
||||
5. gpg --verify SHA256SUMS.asc<br>
|
||||
</li>
|
||||
<li>5. After the last command, you should see a few lines of output - make sure they contain “Good signature” and the key identity and fingerprint are correct.</li>
|
||||
<li><img src="https://specter.solutions/wp-content/uploads/2021/10/good_sig.png" width="100%"></li>
|
||||
<li>6. Verify the sha256 of the Specter software file is indeed in the signed hashes file by running:</li>
|
||||
<li class="code-display">
|
||||
sha256sum -c SHA256SUMS --ignore-missing<br>
|
||||
</li>
|
||||
<li>7. Make sure the output shows “OK” next to the file name, similiar to this (example from MacOS but you get the idea):</li>
|
||||
<li><img src="https://specter.solutions/wp-content/uploads/2021/10/file_ok.png" width="100%"></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<span class="popup-button linux"><i class="fas fa-info-circle"></i> Verify signature</span>
|
||||
</li>
|
||||
</ul>
|
||||
<p class="open-source">
|
||||
<a href="{{current.signatures.browser_download_url}}">Signatures</a><br>
|
||||
View our Open Source project on <a href="https://github.com/cryptoadvance/specter-desktop" target="_blank">Github.</a></p>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
var coll = document.getElementsByClassName("collapsible");
|
||||
var i;
|
||||
|
||||
for (i = 0; i < coll.length; i++) {
|
||||
coll[i].addEventListener("click", function() {
|
||||
this.classList.toggle("active");
|
||||
var content = this.nextElementSibling;
|
||||
if (content.style.display === "block") {
|
||||
content.style.display = "none";
|
||||
} else {
|
||||
content.style.display = "block";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const callButtonMac = document.querySelector('.popup-button.mac');
|
||||
const popupMac = document.querySelector('.popup.mac');
|
||||
|
||||
const callButtonLinux = document.querySelector('.popup-button.linux');
|
||||
const popupLinux = document.querySelector('.popup.linux');
|
||||
|
||||
const callButtonWindows = document.querySelector('.popup-button.windows');
|
||||
const popupWindows = document.querySelector('.popup.windows');
|
||||
|
||||
const closeButtonMac = popupMac.querySelector('.close-button');
|
||||
const closeButtonLinux = popupLinux.querySelector('.close-button');
|
||||
const closeButtonWindows = popupWindows.querySelector('.close-button');
|
||||
|
||||
popupToggleMac = () => {
|
||||
popupMac.classList.toggle('popup_opened');
|
||||
}
|
||||
|
||||
callButtonMac.addEventListener('click', popupToggleMac);
|
||||
closeButtonMac.addEventListener('click', popupToggleMac);
|
||||
|
||||
popupToggleLinux = () => {
|
||||
popupLinux.classList.toggle('popup_opened');
|
||||
}
|
||||
|
||||
callButtonLinux.addEventListener('click', popupToggleLinux);
|
||||
closeButtonLinux.addEventListener('click', popupToggleLinux);
|
||||
|
||||
popupToggleWindows = () => {
|
||||
popupWindows.classList.toggle('popup_opened');
|
||||
}
|
||||
|
||||
callButtonWindows.addEventListener('click', popupToggleWindows);
|
||||
closeButtonWindows.addEventListener('click', popupToggleWindows);
|
||||
</script>
|
||||
|
||||
</html>
|
||||
136
utils/templates/download-page_releases.html
Normal file
136
utils/templates/download-page_releases.html
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
<html>
|
||||
|
||||
<style>
|
||||
|
||||
/*LIST SECTION*/
|
||||
/* Add a background color to the button if it is clicked on (add the .active class with JS), and when you move the mouse over it (hover) */
|
||||
.collapsible.active {
|
||||
background-color: #293142 !important;
|
||||
border-radius: 5px 5px 0px 0px !important;
|
||||
}
|
||||
/* Style the collapsible content. Note: hidden by default */
|
||||
.release-content {
|
||||
padding: 30px 18px;
|
||||
display: none;
|
||||
overflow: hidden;
|
||||
background-color: #293142;
|
||||
border-radius: 0px 5px 5px 5px;
|
||||
}
|
||||
h2.releases {
|
||||
font-size: 40px;
|
||||
}
|
||||
h3.release-title {
|
||||
margin-top: 40px;
|
||||
padding-top: 40px;
|
||||
border-top: 1px solid rgba(255,255,255,0.3);
|
||||
position: relative;
|
||||
text-transform: none;
|
||||
font-size: 30px;
|
||||
}
|
||||
h3.release-title .latest {
|
||||
background-color: #10ac84;
|
||||
color: #222222;
|
||||
border: 1px solid #10ac84;
|
||||
padding: 1px 7px;
|
||||
border-radius: 20px;
|
||||
font-size: 8px;
|
||||
text-transform: uppercase;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
position: relative;
|
||||
bottom: 4px;
|
||||
font-weight: 700;
|
||||
display: inline-block;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
.release-content h1, .release-content h2 {
|
||||
font-size: 20px;
|
||||
text-transform: none;
|
||||
}
|
||||
.release-content p, .release-content ul li {
|
||||
font-size: 14px;
|
||||
}
|
||||
.assets li a {
|
||||
margin-left: 15px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.assets li a .fas {
|
||||
margin-right: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.date {
|
||||
color: rgb(40, 157, 184);
|
||||
margin-bottom: 15px;
|
||||
display: inline-block;
|
||||
font-size: 12px;
|
||||
}
|
||||
.assets {
|
||||
border: 1px solid rgba(255,255,255,0.3);
|
||||
border-radius: 5px;
|
||||
padding: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.assets h4 {
|
||||
margin-bottom: 0;
|
||||
|
||||
}
|
||||
.assets ul {
|
||||
list-style-type: none;
|
||||
margin-left: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.assets ul li {
|
||||
line-height: 40px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0.3);
|
||||
}
|
||||
.assets ul li:last-child {
|
||||
line-height: 40px;
|
||||
border-bottom: 1px solid rgba(255,255,255,0);
|
||||
}
|
||||
</style>
|
||||
|
||||
<h2 class="releases">Specter Releases:</h2>
|
||||
|
||||
{% for release in data if not release["is_pre_release"] %}
|
||||
|
||||
<h3 class="release-title">
|
||||
{{ release.name }}
|
||||
{% if loop.index == 1 %}
|
||||
<span class="latest">Latest</span>
|
||||
{% endif %}
|
||||
</h3>
|
||||
<div class="date">Date: {{release.published_at.strftime('%Y-%m-%d')}}</div>
|
||||
<div class="assets"><h4>Assets:</h4><br>
|
||||
<ul>
|
||||
{% for asset in release.assets %}
|
||||
<li><a href="{{asset.browser_download_url}}"><i aria-hidden="true" class="fas fa-download"></i> {{asset.name}}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
<button type="button" class="collapsible">{{ release.name }} details</button>
|
||||
<div class="release-content">
|
||||
{{ release.body | markdown}}
|
||||
</div>
|
||||
|
||||
{% endfor %}
|
||||
|
||||
<script>
|
||||
|
||||
var coll = document.getElementsByClassName("collapsible");
|
||||
var i;
|
||||
|
||||
for (i = 0; i < coll.length; i++) {
|
||||
coll[i].addEventListener("click", function() {
|
||||
this.classList.toggle("active");
|
||||
var content = this.nextElementSibling;
|
||||
if (content.style.display === "block") {
|
||||
content.style.display = "none";
|
||||
} else {
|
||||
content.style.display = "block";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
</html>
|
||||
34
utils/templates/gh_release-page-v2.md
Normal file
34
utils/templates/gh_release-page-v2.md
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
*Please create a full backup* before migrating or any major internal changes like switching to an electrum based installation. You can easily create a backup in Settings --> Backup Specter (zip file).
|
||||
|
||||
## Artifacts
|
||||
|
||||
Specter is available in several forms: as a GUI application, as a binary that can be executed like a web app, and as a PyPI package. Additionally, Specter is available as a Docker image via the awesome [Chiang Mai LN devs](https://github.com/lncm/docker-specter-desktop).
|
||||
|
||||
Signed hashsum files are available for all binaries.
|
||||
|
||||
## GUI Application
|
||||
|
||||
This is a GUI application with a windowed interface, which includes the Specter server.
|
||||
Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-Setup-{{ data.version }}.exe), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-{{ data.version }}.dmg), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specter_desktop-{{ data.version }}-x86_64-linux-gnu.tar.gz)
|
||||
|
||||
**Note on Linux**: you need to set up udev rules (included in the archive). Check out the [readme](https://github.com/cryptoadvance/specter-desktop/blob/master/udev/README.md#usage).
|
||||
|
||||
**Note on macOS**: The current build supports only macOS Catalina (10.15) or higher. If you'd like to run Specter on an older macOS version, you can [install Specter from Pip](https://github.com/cryptoadvance/specter-desktop#installing-specter-from-pip).
|
||||
|
||||
|
||||
## specterd
|
||||
Specterd is a command-line program that runs only the Specter server, behaving like a traditional web application.
|
||||
Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-win64.zip), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-osx.zip), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-x86_64-linux-gnu.zip)
|
||||
|
||||
## PyPi Packages
|
||||
|
||||
If you’re experienced Python user and/or developer, you might appreciate the [pypi-packages](https://pypi.org/project/cryptoadvance.specter/) which are also available on our github-release-page.
|
||||
|
||||
## Signatures and hashes
|
||||
[SHA256SUMS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/SHA256SUMS) file contains sha256 hashes of all binary files and signed with "Specter Signer's" GPG key.
|
||||
You can get the public key from [here](http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7).
|
||||
Fingerprint of the key is `785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7`
|
||||
This key has been signed by @k9ert's key. For more information about Verifying signatures, see, e.g. this video.
|
||||
|
||||
# Release notes
|
||||
{{ data.release_notes }}
|
||||
24
utils/templates/gh_release-page.md
Normal file
24
utils/templates/gh_release-page.md
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
# Binaries
|
||||
|
||||
There are two types of binaries:
|
||||
|
||||
## Specter Desktop
|
||||
It's a windowed GUI application with Specter server included.
|
||||
Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-Setup-{{ data.version }}.exe), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/Specter-{{ data.version }}.dmg), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specter_desktop-{{ data.version }}-x86_64-linux-gnu.tar.gz)
|
||||
|
||||
**Note on Linux**: you need to set up udev rules (included in the archive). Check out [readme](https://github.com/cryptoadvance/specter-desktop/blob/master/udev/README.md#usage).
|
||||
|
||||
**Note on macOS**: The current build supports only macOS Catalina (10.15) or higher. If you'd like to run Specter on an older macOS version, you can [install Specter from Pip](https://github.com/cryptoadvance/specter-desktop#installing-specter-from-pip).
|
||||
|
||||
## specterd
|
||||
It's a command-line program that only runs Specter server.
|
||||
Supported platforms: [Windows](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-win64.zip), [MacOS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-osx.zip), [Linux (x86_64)](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/specterd-{{ data.version }}-x86_64-linux-gnu.zip)
|
||||
|
||||
## Signatures and hashes
|
||||
[SHA256SUMS](https://github.com/cryptoadvance/specter-desktop/releases/download/{{ data.version }}/SHA256SUMS) file contains sha256 hashes of all binary files and signed with "Specter Signer's" GPG key.
|
||||
You can get the public key from [here](http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x785a2269ee3a9736ac1a4f4c864b7cf9a811fef7).
|
||||
Fingerprint of the key is `785A 2269 EE3A 9736 AC1A 4F4C 864B 7CF9 A811 FEF7`
|
||||
This key has been signed by @k9ert's key which you might have used for validating th 1.7.0 release.
|
||||
|
||||
# Release notes
|
||||
{{ data.release_notes }}
|
||||
Loading…
Add table
Add a link
Reference in a new issue