Merge branch 'master' into fmt
This commit is contained in:
commit
a2ae63cefe
16
.cirrus.yml
16
.cirrus.yml
|
@ -1,22 +1,28 @@
|
||||||
task:
|
task:
|
||||||
name: freebsd-build
|
name: freebsd-build
|
||||||
freebsd_instance:
|
freebsd_instance:
|
||||||
image_family: freebsd-12-2
|
matrix:
|
||||||
|
- image_family: freebsd-12-2
|
||||||
|
- image_family: freebsd-13-0
|
||||||
|
|
||||||
prepare_script:
|
prepare_script:
|
||||||
- pkg install -yq git cmake jpeg-turbo mysql80-client ffmpeg libvncserver libjwt libfmt catch p5-DBI p5-DBD-mysql p5-Date-Manip p5-Test-LWP-UserAgent p5-Sys-Mmap
|
- pkg install -yq git cmake pkgconf jpeg-turbo mysql80-client ffmpeg libvncserver libjwt libfmt catch p5-DBI p5-DBD-mysql p5-Date-Manip p5-Test-LWP-UserAgent p5-Sys-Mmap v4l_compat
|
||||||
|
|
||||||
configure_script:
|
configure_script:
|
||||||
- git submodule update --init --recursive
|
- git submodule update --init --recursive
|
||||||
- mkdir build
|
- mkdir build
|
||||||
- cd build
|
- cd build
|
||||||
- cmake ../ -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1
|
- cmake --version
|
||||||
|
- cmake ../ -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1 -DCMAKE_C_FLAGS="-Wno-deprecated-declarations" -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations"
|
||||||
|
|
||||||
build_script:
|
build_script:
|
||||||
- cd build
|
- cd build
|
||||||
- make -j3
|
- make -j3
|
||||||
|
|
||||||
|
install_script:
|
||||||
|
- cd build
|
||||||
- make install
|
- make install
|
||||||
|
|
||||||
test_script:
|
test_script:
|
||||||
- cd build
|
- cd build/tests
|
||||||
- make test
|
- ./tests "~[notCI]"
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
web/api/lib
|
web/api/lib
|
||||||
web/includes/csrf/
|
web/includes/csrf/
|
||||||
web/js/videojs.zoomrotate.js
|
web/js/videojs.zoomrotate.js
|
||||||
web/skins/classic/js/bootstrap.js
|
web/skins/classic/js/bootstrap-4.5.0.js
|
||||||
web/skins/classic/js/chosen
|
web/skins/classic/js/chosen
|
||||||
web/skins/classic/js/dateTimePicker
|
web/skins/classic/js/dateTimePicker
|
||||||
web/skins/classic/js/jquery-*.js
|
web/skins/classic/js/jquery-*.js
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
github: [connortechnology,pliablepixels] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
github: [connortechnology,pliablepixels] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
patreon: zoneminder # Replace with a single Patreon username
|
patreon: zoneminder # Replace with a single Patreon username
|
||||||
open_collective: # Replace with a single Open Collective username
|
open_collective: zoneminder # Replace with a single Open Collective username
|
||||||
ko_fi: # Replace with a single Ko-fi username
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
name: CI Ubuntu Bionic (18.04)
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
crypto_backend: [ openssl ]
|
||||||
|
jwt_backend: [ libjwt, jwt_cpp ]
|
||||||
|
include:
|
||||||
|
- crypto_backend: openssl
|
||||||
|
crypto_package: libssl-dev
|
||||||
|
jwt_package: libjwt-dev
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: ubuntu:bionic
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Update packages
|
||||||
|
run: apt-get -qq update && apt-get -qq upgrade && apt-get -qq install software-properties-common
|
||||||
|
- name: Install git
|
||||||
|
run: |
|
||||||
|
add-apt-repository ppa:git-core/ppa
|
||||||
|
apt-get -qq update
|
||||||
|
apt-get -qq install git
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: >
|
||||||
|
apt-get -qq install make cmake g++
|
||||||
|
default-libmysqlclient-dev
|
||||||
|
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||||
|
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||||
|
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||||
|
libpolkit-gobject-1-dev
|
||||||
|
${{ matrix.crypto_package }} ${{ matrix.jwt_package }}
|
||||||
|
- name: Prepare
|
||||||
|
run: mkdir build
|
||||||
|
- name: Configure
|
||||||
|
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||||
|
- name: Build
|
||||||
|
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -0,0 +1,57 @@
|
||||||
|
name: CI Debian Bullseye
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
crypto_backend: [ gnutls, openssl ]
|
||||||
|
jwt_backend: [ libjwt, jwt_cpp ]
|
||||||
|
include:
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
crypto_package: libgnutls28-dev
|
||||||
|
jwt_package: libjwt-gnutls-dev
|
||||||
|
- crypto_backend: openssl
|
||||||
|
crypto_package: libssl-dev
|
||||||
|
jwt_package: libjwt-dev
|
||||||
|
exclude:
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
jwt_backend: jwt_cpp
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: debian:bullseye
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Update packages
|
||||||
|
run: apt-get -qq update && apt-get -qq upgrade
|
||||||
|
- name: Install git
|
||||||
|
run: apt-get -qq install git
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: >
|
||||||
|
apt-get -qq install make cmake g++
|
||||||
|
default-libmysqlclient-dev
|
||||||
|
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||||
|
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||||
|
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||||
|
libpolkit-gobject-1-dev
|
||||||
|
catch2
|
||||||
|
${{ matrix.crypto_package }} ${{ matrix.jwt_package }}
|
||||||
|
- name: Prepare
|
||||||
|
run: mkdir build
|
||||||
|
- name: Configure
|
||||||
|
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||||
|
- name: Build
|
||||||
|
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
||||||
|
- name: Run tests
|
||||||
|
run: cd build/tests && ./tests "~[notCI]"
|
|
@ -0,0 +1,54 @@
|
||||||
|
name: CI Debian Buster
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
crypto_backend: [ gnutls, openssl ]
|
||||||
|
jwt_backend: [ libjwt, jwt_cpp ]
|
||||||
|
include:
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
crypto_package: libgnutls28-dev
|
||||||
|
jwt_package: libjwt-gnutls-dev
|
||||||
|
- crypto_backend: openssl
|
||||||
|
crypto_package: libssl-dev
|
||||||
|
jwt_package: libjwt-dev
|
||||||
|
exclude:
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
jwt_backend: jwt_cpp
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: debian:buster
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Update packages
|
||||||
|
run: apt-get -qq update && apt-get -qq upgrade
|
||||||
|
- name: Install git
|
||||||
|
run: apt-get -qq install git
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: >
|
||||||
|
apt-get -qq install make cmake g++
|
||||||
|
default-libmysqlclient-dev
|
||||||
|
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||||
|
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||||
|
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||||
|
libpolkit-gobject-1-dev
|
||||||
|
${{ matrix.crypto_package }} ${{ matrix.jwt_package }}
|
||||||
|
- name: Prepare
|
||||||
|
run: mkdir build
|
||||||
|
- name: Configure
|
||||||
|
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||||
|
- name: Build
|
||||||
|
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -0,0 +1,39 @@
|
||||||
|
name: CI CentOS 7
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
crypto_backend: [ gnutls, openssl ]
|
||||||
|
jwt_backend: [ libjwt, jwt_cpp ]
|
||||||
|
exclude:
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
jwt_backend: jwt_cpp
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
jwt_backend: libjwt
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: centos:7
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Enable RPMFusion and EPEL
|
||||||
|
run: yum -y install https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||||
|
- name: Install git
|
||||||
|
run: yum -y install https://repo.ius.io/ius-release-el7.rpm && yum -y install git224
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yum -y update && yum -y install make cmake3 gcc-c++ mariadb-devel ffmpeg-devel libcurl-devel vlc-devel libvncserver-devel libjpeg-turbo-devel "perl(Date::Manip)" "perl(DBD::mysql)" "perl(ExtUtils::MakeMaker)" "perl(Sys::Mmap)" "perl(Sys::Syslog)" "perl(LWP::UserAgent)" polkit-devel libjwt-devel
|
||||||
|
- name: Prepare
|
||||||
|
run: mkdir build
|
||||||
|
- name: Configure
|
||||||
|
run: cd build && cmake3 --version && cmake3 .. -DBUILD_MAN=0 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||||
|
- name: Build
|
||||||
|
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -0,0 +1,41 @@
|
||||||
|
name: CI CentOS 8
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
crypto_backend: [ gnutls, openssl ]
|
||||||
|
jwt_backend: [ libjwt, jwt_cpp ]
|
||||||
|
exclude:
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
jwt_backend: jwt_cpp
|
||||||
|
- crypto_backend: gnutls
|
||||||
|
jwt_backend: libjwt
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: centos:8
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Enable RPMFusion, EPEL and PowerTools
|
||||||
|
run: yum -y install "dnf-command(config-manager)" https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && yum config-manager --set-enabled powertools
|
||||||
|
- name: Install git
|
||||||
|
run: yum -y install git
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yum -y update && yum -y install make cmake gcc-c++ catch-devel mariadb-devel ffmpeg-devel libcurl-devel vlc-devel libvncserver-devel libjpeg-turbo-devel "perl(Date::Manip)" "perl(DBD::mysql)" "perl(ExtUtils::MakeMaker)" "perl(Sys::Mmap)" "perl(Sys::Syslog)" "perl(LWP::UserAgent)" polkit-devel libjwt-devel
|
||||||
|
- name: Prepare
|
||||||
|
run: mkdir build
|
||||||
|
- name: Configure
|
||||||
|
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||||
|
- name: Build
|
||||||
|
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
||||||
|
- name: Run tests
|
||||||
|
run: cd build/tests && ./tests "~[notCI]"
|
|
@ -0,0 +1,21 @@
|
||||||
|
name: CI ESLint
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
eslint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install ESLint
|
||||||
|
run: npm install eslint@5.12.0 eslint-config-google@0.11.0 eslint-plugin-html@5.0.0 eslint-plugin-php-markup@0.2.5
|
||||||
|
- name: Run ESLint
|
||||||
|
run: npx eslint --ext .php,.js .
|
|
@ -0,0 +1,40 @@
|
||||||
|
name: CI Debian Stretch
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container: debian:stretch-backports
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Update packages
|
||||||
|
run: apt-get -qq update && apt-get -qq upgrade
|
||||||
|
- name: Install git
|
||||||
|
run: apt-get -qq install git/stretch-backports git-man/stretch-backports
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Install dependencies
|
||||||
|
run: >
|
||||||
|
apt-get -qq install make cmake g++
|
||||||
|
default-libmysqlclient-dev
|
||||||
|
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||||
|
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||||
|
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||||
|
libpolkit-gobject-1-dev
|
||||||
|
libssl-dev
|
||||||
|
- name: Prepare
|
||||||
|
run: mkdir build
|
||||||
|
- name: Configure
|
||||||
|
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1
|
||||||
|
- name: Build
|
||||||
|
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -52,9 +52,11 @@ jobs:
|
||||||
git submodule init
|
git submodule init
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install libx264-dev libmp4v2-dev libavdevice-dev libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
|
||||||
sudo apt-get install libbz2-dev libgcrypt20-dev libcurl4-gnutls-dev libjpeg-turbo8-dev libturbojpeg0-dev
|
sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libjwt-gnutls-dev
|
||||||
sudo apt-get install default-libmysqlclient-dev libpcre3-dev libpolkit-gobject-1-dev libv4l-dev libvlc-dev libfmt-dev
|
sudo apt-get install libbz2-dev libcurl4-gnutls-dev libjpeg-turbo8-dev libturbojpeg0-dev
|
||||||
|
sudo apt-get install default-libmysqlclient-dev libpcre3-dev libpolkit-gobject-1-dev libv4l-dev libvlc-dev ab9c538c3
|
||||||
|
|
||||||
sudo apt-get install libdate-manip-perl libdbd-mysql-perl libphp-serialization-perl libsys-mmap-perl
|
sudo apt-get install libdate-manip-perl libdbd-mysql-perl libphp-serialization-perl libsys-mmap-perl
|
||||||
sudo apt-get install libwww-perl libdata-uuid-perl libssl-dev libcrypt-eksblowfish-perl libdata-entropy-perl
|
sudo apt-get install libwww-perl libdata-uuid-perl libssl-dev libcrypt-eksblowfish-perl libdata-entropy-perl
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
name: Create packages
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- '*'
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
package:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os_dist:
|
||||||
|
- os: debian
|
||||||
|
dist: buster
|
||||||
|
- os: debian
|
||||||
|
dist: bullseye
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
- name: Run packpack
|
||||||
|
env:
|
||||||
|
SMPFLAGS: -j4
|
||||||
|
OS: ${{ matrix.os_dist.os }}
|
||||||
|
DIST: ${{ matrix.os_dist.dist }}
|
||||||
|
DOCKER_REPO: iconzm/packpack
|
||||||
|
run: utils/packpack/startpackpack.sh
|
|
@ -120,12 +120,11 @@ src/CMakeFiles/
|
||||||
src/cmake_install.cmake
|
src/cmake_install.cmake
|
||||||
src/libzm.a
|
src/libzm.a
|
||||||
src/nph-zms
|
src/nph-zms
|
||||||
src/zm_config_data.h
|
|
||||||
src/zm_config_defines.h
|
|
||||||
src/zmc
|
src/zmc
|
||||||
src/zmf
|
src/zmf
|
||||||
src/zms
|
src/zms
|
||||||
src/zmu
|
src/zmu
|
||||||
|
src/zm_rtsp_server
|
||||||
src/zoneminder-zmc.8
|
src/zoneminder-zmc.8
|
||||||
src/zoneminder-zmc.8.gz
|
src/zoneminder-zmc.8.gz
|
||||||
src/zoneminder-zmf.8
|
src/zoneminder-zmf.8
|
||||||
|
@ -154,4 +153,6 @@ web/undef.log
|
||||||
zm.conf
|
zm.conf
|
||||||
zmconfgen.pl
|
zmconfgen.pl
|
||||||
zmlinkcontent.sh
|
zmlinkcontent.sh
|
||||||
|
zm_config_data.h
|
||||||
|
zm_config_defines.h
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
default:
|
||||||
|
image:
|
||||||
|
name: ubuntu:latest
|
||||||
|
before_script:
|
||||||
|
- apt-get update -yq
|
||||||
|
- DEBIAN_FRONTEND=noninteractive apt-get install -yq devscripts sudo
|
||||||
|
|
||||||
|
deb:
|
||||||
|
stage: build
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
script:
|
||||||
|
- yes "" | ./utils/do_debian_package.sh --snapshot=stable --type=binary --interactive=no --dput=no --debbuild-extra=--no-sign || true
|
||||||
|
timeout: 2h
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- '*.deb'
|
||||||
|
expire_in: 1 week
|
|
@ -4,4 +4,7 @@
|
||||||
branch = 3.0
|
branch = 3.0
|
||||||
[submodule "web/api/app/Plugin/CakePHP-Enum-Behavior"]
|
[submodule "web/api/app/Plugin/CakePHP-Enum-Behavior"]
|
||||||
path = web/api/app/Plugin/CakePHP-Enum-Behavior
|
path = web/api/app/Plugin/CakePHP-Enum-Behavior
|
||||||
url = https://github.com/ZoneMinder/CakePHP-Enum-Behavior.git
|
Url = https://github.com/ZoneMinder/CakePHP-Enum-Behavior.git
|
||||||
|
[submodule "dep/RtspServer"]
|
||||||
|
path = dep/RtspServer
|
||||||
|
url = https://github.com/ZoneMinder/RtspServer
|
||||||
|
|
58
.travis.yml
58
.travis.yml
|
@ -1,58 +0,0 @@
|
||||||
language: cpp
|
|
||||||
sudo: required
|
|
||||||
dist: bionic
|
|
||||||
git:
|
|
||||||
depth: 9999999
|
|
||||||
notifications:
|
|
||||||
irc: chat.freenode.net#zoneminder-dev
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- modern
|
|
||||||
cache: ccache
|
|
||||||
addons:
|
|
||||||
ssh_known_hosts: zmrepo.zoneminder.com
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- sourceline: ppa:iconnor/zoneminder-master
|
|
||||||
- key_url: http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x4D0BF748776FFB04
|
|
||||||
packages:
|
|
||||||
- gdebi
|
|
||||||
- yum-utils
|
|
||||||
- patch
|
|
||||||
- git
|
|
||||||
- curl
|
|
||||||
- sshfs
|
|
||||||
- sed
|
|
||||||
- binfmt-support
|
|
||||||
- qemu
|
|
||||||
- qemu-user-static
|
|
||||||
- dnsutils
|
|
||||||
- traceroute
|
|
||||||
install:
|
|
||||||
- update-binfmts --enable qemu-arm
|
|
||||||
|
|
||||||
env:
|
|
||||||
- SMPFLAGS=-j4 OS=eslint DIST=eslint
|
|
||||||
- SMPFLAGS=-j4 OS=ubuntu DIST=bionic DOCKER_REPO=iconzm/packpack
|
|
||||||
|
|
||||||
compiler:
|
|
||||||
- gcc
|
|
||||||
services:
|
|
||||||
- mysql
|
|
||||||
- docker
|
|
||||||
|
|
||||||
script:
|
|
||||||
- utils/packpack/startpackpack.sh
|
|
||||||
|
|
||||||
before_deploy:
|
|
||||||
- openssl aes-256-cbc -K $encrypted_62a62750aa73_key -iv $encrypted_62a62750aa73_iv -in ./utils/packpack/deploy_rsa.enc -out /tmp/deploy_rsa -d
|
|
||||||
- eval "$(ssh-agent -s)"
|
|
||||||
- chmod 600 /tmp/deploy_rsa
|
|
||||||
- ssh-add /tmp/deploy_rsa
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: script
|
|
||||||
skip_cleanup: true
|
|
||||||
script: utils/packpack/rsync_xfer.sh
|
|
||||||
on:
|
|
||||||
branch: master
|
|
294
CMakeLists.txt
294
CMakeLists.txt
|
@ -69,9 +69,7 @@ include(GNUInstallDirs)
|
||||||
include(CheckIncludeFile)
|
include(CheckIncludeFile)
|
||||||
include(CheckIncludeFiles)
|
include(CheckIncludeFiles)
|
||||||
include(CheckFunctionExists)
|
include(CheckFunctionExists)
|
||||||
include(CheckPrototypeDefinition_fixed)
|
|
||||||
include(CheckTypeSize)
|
include(CheckTypeSize)
|
||||||
include(CheckStructHasMember)
|
|
||||||
include(CheckSendfile)
|
include(CheckSendfile)
|
||||||
|
|
||||||
# Configuration options
|
# Configuration options
|
||||||
|
@ -90,6 +88,7 @@ mark_as_advanced(
|
||||||
ZM_SYSTEMD
|
ZM_SYSTEMD
|
||||||
ZM_MANPAGE_DEST_PREFIX)
|
ZM_MANPAGE_DEST_PREFIX)
|
||||||
|
|
||||||
|
option(ENABLE_WERROR "Fail the build if a compiler warning is emitted" 0)
|
||||||
option(BUILD_TEST_SUITE "Build the test suite" 0)
|
option(BUILD_TEST_SUITE "Build the test suite" 0)
|
||||||
option(BUILD_MAN "Build man pages" 1)
|
option(BUILD_MAN "Build man pages" 1)
|
||||||
option(ASAN "DEBUGGING: Build with AddressSanitizer (ASan) support" 0)
|
option(ASAN "DEBUGGING: Build with AddressSanitizer (ASan) support" 0)
|
||||||
|
@ -169,7 +168,7 @@ set(ZM_ONVIF "ON" CACHE BOOL
|
||||||
"Set to ON to enable basic ONVIF support. This is EXPERIMENTAL and may not
|
"Set to ON to enable basic ONVIF support. This is EXPERIMENTAL and may not
|
||||||
work with all cameras claiming to be ONVIF compliant. default: ON")
|
work with all cameras claiming to be ONVIF compliant. default: ON")
|
||||||
set(ZM_NO_RTSPSERVER "OFF" CACHE BOOL
|
set(ZM_NO_RTSPSERVER "OFF" CACHE BOOL
|
||||||
"Set to ON to skip live555 checks and force building ZM without rtsp server support. default: OFF")
|
"Set to ON to skip building ZM with rtsp server support. default: OFF")
|
||||||
set(ZM_PERL_MM_PARMS INSTALLDIRS=vendor NO_PACKLIST=1 NO_PERLLOCAL=1 CACHE STRING
|
set(ZM_PERL_MM_PARMS INSTALLDIRS=vendor NO_PACKLIST=1 NO_PERLLOCAL=1 CACHE STRING
|
||||||
"By default, ZoneMinder's Perl modules are installed into the Vendor folders,
|
"By default, ZoneMinder's Perl modules are installed into the Vendor folders,
|
||||||
as defined by your installation of Perl. You can change that here. Consult Perl's
|
as defined by your installation of Perl. You can change that here. Consult Perl's
|
||||||
|
@ -188,8 +187,32 @@ set(ZM_MANPAGE_DEST_PREFIX "share/man" CACHE PATH
|
||||||
"Relative path used to install ZoneMinder's Man pages into a
|
"Relative path used to install ZoneMinder's Man pages into a
|
||||||
non-standard folder. Most Linux users will not need to change this.
|
non-standard folder. Most Linux users will not need to change this.
|
||||||
BSD users may need to set this.")
|
BSD users may need to set this.")
|
||||||
|
set(ZM_CAKEPHP_CACHE "Apc" CACHE STRING
|
||||||
|
"Set the CakePHP cache engine, default: Apc")
|
||||||
|
|
||||||
|
# Supported crypto backends. Using OpenSSL by default to be compatible with jwt-cpp.
|
||||||
|
set(ZM_CRYPTO_BACKEND_OPTIONS gnutls openssl)
|
||||||
|
set(ZM_CRYPTO_BACKEND openssl CACHE STRING "Determines which crypto backend should be used.")
|
||||||
|
set_property(CACHE ZM_CRYPTO_BACKEND PROPERTY STRINGS ${ZM_CRYPTO_BACKEND_OPTIONS})
|
||||||
|
|
||||||
|
if(NOT ZM_CRYPTO_BACKEND IN_LIST ZM_CRYPTO_BACKEND_OPTIONS)
|
||||||
|
message(FATAL_ERROR "Invalid value for ZM_CRYPTO_BACKEND. Possible options: ${ZM_CRYPTO_BACKEND_OPTIONS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Supported JWT backends. Using jwt-cpp as default.
|
||||||
|
set(ZM_JWT_BACKEND_OPTIONS libjwt jwt_cpp)
|
||||||
|
set(ZM_JWT_BACKEND jwt_cpp CACHE STRING "Determines which JWT backend should be used.")
|
||||||
|
set_property(CACHE ZM_JWT_BACKEND PROPERTY STRINGS ${ZM_JWT_BACKEND_OPTIONS})
|
||||||
|
|
||||||
|
if(NOT ZM_JWT_BACKEND IN_LIST ZM_JWT_BACKEND_OPTIONS)
|
||||||
|
message(FATAL_ERROR "Invalid value for ZM_JWT_BACKEND. Possible options: ${ZM_JWT_BACKEND_OPTIONS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Reassign some variables if a target distro has been specified
|
# Reassign some variables if a target distro has been specified
|
||||||
|
if(ZM_TARGET_DISTRO MATCHES "^fc")
|
||||||
|
set(ZM_CAKEPHP_CACHE "Memcached")
|
||||||
|
endif()
|
||||||
|
|
||||||
if((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
if((ZM_TARGET_DISTRO MATCHES "^el") OR (ZM_TARGET_DISTRO MATCHES "^fc"))
|
||||||
set(ZM_RUNDIR "/var/run/zoneminder")
|
set(ZM_RUNDIR "/var/run/zoneminder")
|
||||||
set(ZM_SOCKDIR "/var/lib/zoneminder/sock")
|
set(ZM_SOCKDIR "/var/lib/zoneminder/sock")
|
||||||
|
@ -236,8 +259,6 @@ endif()
|
||||||
|
|
||||||
# Required for certain checks to work
|
# Required for certain checks to work
|
||||||
set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} stdio.h stdlib.h math.h signal.h)
|
set(CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_EXTRA_INCLUDE_FILES} stdio.h stdlib.h math.h signal.h)
|
||||||
# Required for including headers from the this folder
|
|
||||||
include_directories("${CMAKE_BINARY_DIR}")
|
|
||||||
# This is required to enable searching in lib64 (if exists), do not change
|
# This is required to enable searching in lib64 (if exists), do not change
|
||||||
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON)
|
set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON)
|
||||||
|
|
||||||
|
@ -247,11 +268,6 @@ if(ZM_SYSTEMD OR (IS_DIRECTORY /usr/lib/systemd/system) OR (IS_DIRECTORY /lib/sy
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# System checks
|
# System checks
|
||||||
check_include_file("libv4l1-videodev.h" HAVE_LIBV4L1_VIDEODEV_H)
|
|
||||||
if(NOT HAVE_LIBV4L1_VIDEODEV_H)
|
|
||||||
check_include_file("linux/videodev.h" HAVE_LINUX_VIDEODEV_H)
|
|
||||||
endif()
|
|
||||||
check_include_file("linux/videodev2.h" HAVE_LINUX_VIDEODEV2_H)
|
|
||||||
check_include_file("execinfo.h" HAVE_EXECINFO_H)
|
check_include_file("execinfo.h" HAVE_EXECINFO_H)
|
||||||
if(HAVE_EXECINFO_H)
|
if(HAVE_EXECINFO_H)
|
||||||
check_function_exists("backtrace" HAVE_DECL_BACKTRACE)
|
check_function_exists("backtrace" HAVE_DECL_BACKTRACE)
|
||||||
|
@ -331,19 +347,20 @@ else()
|
||||||
"ZoneMinder requires jpeg but it was not found on your system")
|
"ZoneMinder requires jpeg but it was not found on your system")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# LIBJWT
|
# libjwt
|
||||||
find_package(LibJWT)
|
if (${ZM_JWT_BACKEND} STREQUAL "libjwt")
|
||||||
if(LIBJWT_FOUND)
|
find_package(LibJWT REQUIRED COMPONENTS ${ZM_CRYPTO_BACKEND})
|
||||||
set(HAVE_LIBJWT 1)
|
if(LIBJWT_FOUND)
|
||||||
set(optlibsfound "${optlibsfound} LIBJWT")
|
set(HAVE_LIBJWT 1)
|
||||||
list(APPEND ZM_BIN_LIBS "${LIBJWT_LIBRARY}")
|
set(optlibsfound "${optlibsfound} LIBJWT")
|
||||||
else()
|
else()
|
||||||
set(optlibsnotfound "${optlibsnotfound} LIBJWT")
|
set(optlibsnotfound "${optlibsnotfound} LIBJWT")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# gnutls (using find_library and find_path)
|
# GnuTLS
|
||||||
if(HAVE_LIBJWT)
|
if (${ZM_CRYPTO_BACKEND} STREQUAL "gnutls")
|
||||||
find_library(GNUTLS_LIBRARIES gnutls)
|
find_library(GNUTLS_LIBRARIES gnutls REQUIRED)
|
||||||
if(GNUTLS_LIBRARIES)
|
if(GNUTLS_LIBRARIES)
|
||||||
set(HAVE_LIBGNUTLS 1)
|
set(HAVE_LIBGNUTLS 1)
|
||||||
list(APPEND ZM_BIN_LIBS "${GNUTLS_LIBRARIES}")
|
list(APPEND ZM_BIN_LIBS "${GNUTLS_LIBRARIES}")
|
||||||
|
@ -353,23 +370,18 @@ if(HAVE_LIBJWT)
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${GNUTLS_INCLUDE_DIR}")
|
set(CMAKE_REQUIRED_INCLUDES "${GNUTLS_INCLUDE_DIR}")
|
||||||
endif()
|
endif()
|
||||||
mark_as_advanced(FORCE GNUTLS_LIBRARIES GNUTLS_INCLUDE_DIR)
|
mark_as_advanced(FORCE GNUTLS_LIBRARIES GNUTLS_INCLUDE_DIR)
|
||||||
check_include_file("gnutls/gnutls.h" HAVE_GNUTLS_GNUTLS_H)
|
|
||||||
set(optlibsfound "${optlibsfound} GnuTLS")
|
set(optlibsfound "${optlibsfound} GnuTLS")
|
||||||
else()
|
else()
|
||||||
set(optlibsnotfound "${optlibsnotfound} GnuTLS")
|
set(optlibsnotfound "${optlibsnotfound} GnuTLS")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
|
||||||
|
|
||||||
# OpenSSL
|
# OpenSSL
|
||||||
if(NOT HAVE_LIBGNUTLS OR NOT HAVE_LIBJWT)
|
elseif (${ZM_CRYPTO_BACKEND} STREQUAL "openssl")
|
||||||
find_package(OpenSSL)
|
find_package(OpenSSL REQUIRED)
|
||||||
if(OPENSSL_FOUND)
|
if(OPENSSL_FOUND)
|
||||||
set(HAVE_LIBOPENSSL 1)
|
set(HAVE_LIBOPENSSL 1)
|
||||||
set(HAVE_LIBCRYPTO 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${OPENSSL_LIBRARIES}")
|
list(APPEND ZM_BIN_LIBS "${OPENSSL_LIBRARIES}")
|
||||||
include_directories("${OPENSSL_INCLUDE_DIR}")
|
include_directories("${OPENSSL_INCLUDE_DIR}")
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
||||||
check_include_file("openssl/md5.h" HAVE_OPENSSL_MD5_H)
|
|
||||||
set(optlibsfound "${optlibsfound} OpenSSL")
|
set(optlibsfound "${optlibsfound} OpenSSL")
|
||||||
else()
|
else()
|
||||||
set(optlibsnotfound "${optlibsnotfound} OpenSSL")
|
set(optlibsnotfound "${optlibsnotfound} OpenSSL")
|
||||||
|
@ -412,23 +424,6 @@ else()
|
||||||
set(optlibsnotfound "${optlibsnotfound} PCRE")
|
set(optlibsnotfound "${optlibsnotfound} PCRE")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# gcrypt (using find_library and find_path)
|
|
||||||
find_library(GCRYPT_LIBRARIES gcrypt)
|
|
||||||
if(GCRYPT_LIBRARIES)
|
|
||||||
set(HAVE_LIBGCRYPT 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${GCRYPT_LIBRARIES}")
|
|
||||||
find_path(GCRYPT_INCLUDE_DIR gcrypt.h)
|
|
||||||
if(GCRYPT_INCLUDE_DIR)
|
|
||||||
include_directories("${GCRYPT_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${GCRYPT_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)
|
|
||||||
check_include_file("gcrypt.h" HAVE_GCRYPT_H)
|
|
||||||
set(optlibsfound "${optlibsfound} GCrypt")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} GCrypt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# mysqlclient (using find_library and find_path)
|
# mysqlclient (using find_library and find_path)
|
||||||
find_library(MYSQLCLIENT_LIBRARIES mysqlclient PATH_SUFFIXES mysql)
|
find_library(MYSQLCLIENT_LIBRARIES mysqlclient PATH_SUFFIXES mysql)
|
||||||
if(MYSQLCLIENT_LIBRARIES)
|
if(MYSQLCLIENT_LIBRARIES)
|
||||||
|
@ -448,129 +443,19 @@ else()
|
||||||
message(FATAL_ERROR "ZoneMinder requires mysqlclient but it was not found on your system")
|
message(FATAL_ERROR "ZoneMinder requires mysqlclient but it was not found on your system")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
find_package(FFMPEG 55.34.100 REQUIRED
|
||||||
|
COMPONENTS
|
||||||
|
avcodec
|
||||||
|
avformat
|
||||||
|
avutil
|
||||||
|
swresample
|
||||||
|
swscale)
|
||||||
|
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${FFMPEG_avutil_INCLUDE_DIRS})
|
||||||
|
check_include_file("libavutil/hwcontext.h" HAVE_LIBAVUTIL_HWCONTEXT_H)
|
||||||
|
|
||||||
set(PATH_FFMPEG "")
|
set(PATH_FFMPEG "")
|
||||||
set(OPT_FFMPEG "no")
|
set(OPT_FFMPEG "no")
|
||||||
# avformat (using find_library and find_path)
|
|
||||||
find_library(AVFORMAT_LIBRARIES avformat)
|
|
||||||
if(AVFORMAT_LIBRARIES)
|
|
||||||
set(HAVE_LIBAVFORMAT 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${AVFORMAT_LIBRARIES}")
|
|
||||||
find_path(AVFORMAT_INCLUDE_DIR "libavformat/avformat.h" /usr/include/ffmpeg)
|
|
||||||
if(AVFORMAT_INCLUDE_DIR)
|
|
||||||
include_directories("${AVFORMAT_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${AVFORMAT_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE AVFORMAT_LIBRARIES AVFORMAT_INCLUDE_DIR)
|
|
||||||
check_include_file("libavformat/avformat.h" HAVE_LIBAVFORMAT_AVFORMAT_H)
|
|
||||||
set(optlibsfound "${optlibsfound} AVFormat")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} AVFormat")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# avcodec (using find_library and find_path)
|
|
||||||
find_library(AVCODEC_LIBRARIES avcodec)
|
|
||||||
if(AVCODEC_LIBRARIES)
|
|
||||||
set(HAVE_LIBAVCODEC 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${AVCODEC_LIBRARIES}")
|
|
||||||
find_path(AVCODEC_INCLUDE_DIR "libavcodec/avcodec.h" /usr/include/ffmpeg)
|
|
||||||
if(AVCODEC_INCLUDE_DIR)
|
|
||||||
include_directories("${AVCODEC_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${AVCODEC_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE AVCODEC_LIBRARIES AVCODEC_INCLUDE_DIR)
|
|
||||||
check_include_file("libavcodec/avcodec.h" HAVE_LIBAVCODEC_AVCODEC_H)
|
|
||||||
set(optlibsfound "${optlibsfound} AVCodec")
|
|
||||||
else()
|
|
||||||
message(WARNING "\nWhile it should be possible to build ZM without AVCODEC the result will pretty useless.")
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} AVCodec")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# avdevice (using find_library and find_path)
|
|
||||||
find_library(AVDEVICE_LIBRARIES avdevice)
|
|
||||||
if(AVDEVICE_LIBRARIES)
|
|
||||||
set(HAVE_LIBAVDEVICE 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${AVDEVICE_LIBRARIES}")
|
|
||||||
find_path(AVDEVICE_INCLUDE_DIR "libavdevice/avdevice.h" /usr/include/ffmpeg)
|
|
||||||
if(AVDEVICE_INCLUDE_DIR)
|
|
||||||
include_directories("${AVDEVICE_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${AVDEVICE_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE AVDEVICE_LIBRARIES AVDEVICE_INCLUDE_DIR)
|
|
||||||
check_include_file("libavdevice/avdevice.h" HAVE_LIBAVDEVICE_AVDEVICE_H)
|
|
||||||
set(optlibsfound "${optlibsfound} AVDevice")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} AVDevice")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# avutil (using find_library and find_path)
|
|
||||||
find_library(AVUTIL_LIBRARIES avutil)
|
|
||||||
if(AVUTIL_LIBRARIES)
|
|
||||||
set(HAVE_LIBAVUTIL 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${AVUTIL_LIBRARIES}")
|
|
||||||
find_path(AVUTIL_INCLUDE_DIR "libavutil/avutil.h" /usr/include/ffmpeg)
|
|
||||||
if(AVUTIL_INCLUDE_DIR)
|
|
||||||
include_directories("${AVUTIL_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${AVUTIL_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE AVUTIL_LIBRARIES AVUTIL_INCLUDE_DIR)
|
|
||||||
check_include_file("libavutil/avutil.h" HAVE_LIBAVUTIL_AVUTIL_H)
|
|
||||||
check_include_file("libavutil/mathematics.h" HAVE_LIBAVUTIL_MATHEMATICS_H)
|
|
||||||
check_include_file("libavutil/hwcontext.h" HAVE_LIBAVUTIL_HWCONTEXT_H)
|
|
||||||
set(optlibsfound "${optlibsfound} AVUtil")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} AVUtil")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# swscale (using find_library and find_path)
|
|
||||||
find_library(SWSCALE_LIBRARIES swscale)
|
|
||||||
if(SWSCALE_LIBRARIES)
|
|
||||||
set(HAVE_LIBSWSCALE 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${SWSCALE_LIBRARIES}")
|
|
||||||
find_path(SWSCALE_INCLUDE_DIR "libswscale/swscale.h" /usr/include/ffmpeg)
|
|
||||||
if(SWSCALE_INCLUDE_DIR)
|
|
||||||
include_directories("${SWSCALE_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${SWSCALE_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE SWSCALE_LIBRARIES SWSCALE_INCLUDE_DIR)
|
|
||||||
check_include_file("libswscale/swscale.h" HAVE_LIBSWSCALE_SWSCALE_H)
|
|
||||||
set(optlibsfound "${optlibsfound} SWScale")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} SWScale")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# SWresample (using find_library and find_path)
|
|
||||||
find_library(SWRESAMPLE_LIBRARIES swresample)
|
|
||||||
if(SWRESAMPLE_LIBRARIES)
|
|
||||||
set(HAVE_LIBSWRESAMPLE 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${SWRESAMPLE_LIBRARIES}")
|
|
||||||
find_path(SWRESAMPLE_INCLUDE_DIR "libswresample/swresample.h" /usr/include/ffmpeg)
|
|
||||||
if(SWRESAMPLE_INCLUDE_DIR)
|
|
||||||
include_directories("${SWRESAMPLE_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${SWRESAMPLE_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE SWRESAMPLE_LIBRARIES SWRESAMPLE_INCLUDE_DIR)
|
|
||||||
check_include_file("libswresample/swresample.h" HAVE_LIBSWRESAMPLE_SWRESAMPLE_H)
|
|
||||||
set(optlibsfound "${optlibsfound} SWResample")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} SWResample")
|
|
||||||
|
|
||||||
# AVresample (using find_library and find_path)
|
|
||||||
find_library(AVRESAMPLE_LIBRARIES avresample)
|
|
||||||
if(AVRESAMPLE_LIBRARIES)
|
|
||||||
set(HAVE_LIBAVRESAMPLE 1)
|
|
||||||
list(APPEND ZM_BIN_LIBS "${AVRESAMPLE_LIBRARIES}")
|
|
||||||
find_path(AVRESAMPLE_INCLUDE_DIR "libavresample/avresample.h" /usr/include/ffmpeg)
|
|
||||||
if(AVRESAMPLE_INCLUDE_DIR)
|
|
||||||
include_directories("${AVRESAMPLE_INCLUDE_DIR}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${AVRESAMPLE_INCLUDE_DIR}")
|
|
||||||
endif()
|
|
||||||
mark_as_advanced(FORCE AVRESAMPLE_LIBRARIES AVRESAMPLE_INCLUDE_DIR)
|
|
||||||
check_include_file("libavresample/avresample.h" HAVE_LIBAVRESAMPLE_AVRESAMPLE_H)
|
|
||||||
set(optlibsfound "${optlibsfound} AVResample")
|
|
||||||
else()
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} AVResample")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Find the path to the ffmpeg executable
|
# Find the path to the ffmpeg executable
|
||||||
find_program(FFMPEG_EXECUTABLE
|
find_program(FFMPEG_EXECUTABLE
|
||||||
|
@ -629,17 +514,7 @@ endif()
|
||||||
#endif()
|
#endif()
|
||||||
|
|
||||||
if(NOT ZM_NO_RTSPSERVER)
|
if(NOT ZM_NO_RTSPSERVER)
|
||||||
find_package(Live555)
|
set(HAVE_RTSP_SERVER 1)
|
||||||
if(Live555_FOUND)
|
|
||||||
include_directories(${Live555_INCLUDE_DIRS})
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${Live555_INCLUDE_DIRS}")
|
|
||||||
list(APPEND ZM_BIN_LIBS "${Live555_LIBRARIES}")
|
|
||||||
set(HAVE_RTSP_SERVER 1)
|
|
||||||
set(optlibsfound "${optlibsfound} libLive555")
|
|
||||||
else()
|
|
||||||
set(HAVE_RTSP_SERVER 0)
|
|
||||||
set(optlibsnotfound "${optlibsnotfound} libLive555")
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
set(HAVE_RTSP_SERVER 0)
|
set(HAVE_RTSP_SERVER 0)
|
||||||
endif()
|
endif()
|
||||||
|
@ -649,29 +524,19 @@ find_package(fmt REQUIRED)
|
||||||
#
|
#
|
||||||
# *** END OF LIBRARY CHECKS ***
|
# *** END OF LIBRARY CHECKS ***
|
||||||
|
|
||||||
# Check for gnutls or crypto
|
# If libjwt is not present we fall back to jwt-cpp which requires OpenSSL
|
||||||
if((NOT HAVE_LIBCRYPTO) AND (NOT HAVE_LIBGNUTLS))
|
if((NOT HAVE_LIBJWT) AND (NOT HAVE_LIBOPENSSL))
|
||||||
message(FATAL_ERROR "ZoneMinder requires crypto or gnutls but none were found on your system")
|
message(FATAL_ERROR "Using the jwt-cpp backend requires OpenSSL as crypto backend.")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for V4L header files and enable ZM_HAS_V4L, ZM_HAS_V4L1, ZM_HAS_V4L2 accordingly
|
find_package(V4L2)
|
||||||
# Setting to zeros first is required because ZM uses #define for these
|
if(TARGET V4L2::videodev2)
|
||||||
set(ZM_HAS_V4L 0)
|
|
||||||
set(ZM_HAS_V4L1 0)
|
|
||||||
set(ZM_HAS_V4L2 0)
|
|
||||||
if(HAVE_LINUX_VIDEODEV_H OR HAVE_LIBV4L1_VIDEODEV_H)
|
|
||||||
set(ZM_HAS_V4L 1)
|
|
||||||
set(ZM_HAS_V4L1 1)
|
|
||||||
endif()
|
|
||||||
if(HAVE_LINUX_VIDEODEV2_H)
|
|
||||||
set(ZM_HAS_V4L 1)
|
|
||||||
set(ZM_HAS_V4L2 1)
|
set(ZM_HAS_V4L2 1)
|
||||||
endif()
|
else()
|
||||||
if((NOT HAVE_LINUX_VIDEODEV_H)
|
set(ZM_HAS_V4L2 0)
|
||||||
AND (NOT HAVE_LIBV4L1_VIDEODEV_H)
|
|
||||||
AND (NOT HAVE_LINUX_VIDEODEV2_H))
|
|
||||||
message(AUTHOR_WARNING "Video 4 Linux headers weren't found - Analog and USB camera support will not be available")
|
message(AUTHOR_WARNING "Video 4 Linux headers weren't found - Analog and USB camera support will not be available")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for PCRE and enable ZM_PCRE accordingly
|
# Check for PCRE and enable ZM_PCRE accordingly
|
||||||
set(ZM_PCRE 0)
|
set(ZM_PCRE 0)
|
||||||
if(HAVE_LIBPCRE AND HAVE_PCRE_H)
|
if(HAVE_LIBPCRE AND HAVE_PCRE_H)
|
||||||
|
@ -692,42 +557,6 @@ if(ZM_ONVIF)
|
||||||
set(ZM_HAS_ONVIF 1)
|
set(ZM_HAS_ONVIF 1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for authentication functions
|
|
||||||
if(HAVE_OPENSSL_MD5_H)
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
|
||||||
check_prototype_definition(
|
|
||||||
MD5
|
|
||||||
"unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md)" "NULL" "openssl/md5.h"
|
|
||||||
HAVE_MD5_OPENSSL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(HAVE_GNUTLS_GNUTLS_H)
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES "${GNUTLS_LIBRARIES}")
|
|
||||||
set(CMAKE_REQUIRED_INCLUDES "${GNUTLS_INCLUDE_DIR}")
|
|
||||||
check_prototype_definition(
|
|
||||||
gnutls_fingerprint
|
|
||||||
"int gnutls_fingerprint (gnutls_digest_algorithm_t algo, const gnutls_datum_t * data, void *result, size_t * result_size)" "0" "stdlib.h;gnutls/gnutls.h"
|
|
||||||
HAVE_DECL_GNUTLS_FINGERPRINT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT HAVE_DECL_GNUTLS_FINGERPRINT AND HAVE_MD5_OPENSSL)
|
|
||||||
set(HAVE_DECL_MD5 1)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if((NOT HAVE_MD5_OPENSSL) AND (NOT HAVE_DECL_GNUTLS_FINGERPRINT))
|
|
||||||
message(AUTHOR_WARNING
|
|
||||||
"ZoneMinder requires a working MD5 function for hashed authentication but
|
|
||||||
none were found - hashed authentication will not be available")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Dirty fix for zm_user only using openssl's md5 if gnutls and gcrypt are not available.
|
|
||||||
# This needs to be fixed in zm_user.[h,cpp] but such fix will also require changes to configure.ac
|
|
||||||
if(HAVE_LIBCRYPTO AND HAVE_OPENSSL_MD5_H AND HAVE_MD5_OPENSSL)
|
|
||||||
set(HAVE_GCRYPT_H 0)
|
|
||||||
set(HAVE_GNUTLS_OPENSSL_H 0)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Check for Perl
|
# Check for Perl
|
||||||
find_package(Perl)
|
find_package(Perl)
|
||||||
if(NOT PERL_FOUND)
|
if(NOT PERL_FOUND)
|
||||||
|
@ -865,6 +694,9 @@ endif()
|
||||||
message(STATUS "Optional libraries found:${optlibsfound}")
|
message(STATUS "Optional libraries found:${optlibsfound}")
|
||||||
message(STATUS "Optional libraries not found:${optlibsnotfound}")
|
message(STATUS "Optional libraries not found:${optlibsnotfound}")
|
||||||
|
|
||||||
|
message(STATUS "Enabled crypto backend: ${ZM_CRYPTO_BACKEND}")
|
||||||
|
message(STATUS "Enabled JWT backend: ${ZM_JWT_BACKEND}")
|
||||||
|
|
||||||
# Run ZM configuration generator
|
# Run ZM configuration generator
|
||||||
message(STATUS "Running ZoneMinder configuration generator")
|
message(STATUS "Running ZoneMinder configuration generator")
|
||||||
execute_process(COMMAND perl ${CMAKE_CURRENT_BINARY_DIR}/zmconfgen.pl RESULT_VARIABLE ZMCONFGEN_RESULT)
|
execute_process(COMMAND perl ${CMAKE_CURRENT_BINARY_DIR}/zmconfgen.pl RESULT_VARIABLE ZMCONFGEN_RESULT)
|
||||||
|
|
|
@ -30,7 +30,7 @@ This is the recommended method to install ZoneMinder onto your system. ZoneMinde
|
||||||
- Debian from their [default repository](https://packages.debian.org/search?searchon=names&keywords=zoneminder)
|
- Debian from their [default repository](https://packages.debian.org/search?searchon=names&keywords=zoneminder)
|
||||||
- RHEL/CentOS and clones via [RPM Fusion](http://rpmfusion.org)
|
- RHEL/CentOS and clones via [RPM Fusion](http://rpmfusion.org)
|
||||||
- Fedora via [RPM Fusion](http://rpmfusion.org)
|
- Fedora via [RPM Fusion](http://rpmfusion.org)
|
||||||
- OpenSuse via [third party repository](http://www.zoneminder.com/wiki/index.php/Installing_using_ZoneMinder_RPMs_for_SuSE)
|
- OpenSuse via [third party repository](https://wiki.zoneminder.com/Installing_using_ZoneMinder_RPMs_for_SuSE)
|
||||||
- Mageia from their default repository
|
- Mageia from their default repository
|
||||||
- Arch via the [AUR](https://aur.archlinux.org/packages/zoneminder/)
|
- Arch via the [AUR](https://aur.archlinux.org/packages/zoneminder/)
|
||||||
- Gentoo via [Portage Overlays](http://gpo.zugaina.org/www-misc/zoneminder)
|
- Gentoo via [Portage Overlays](http://gpo.zugaina.org/www-misc/zoneminder)
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
@CHECK_PROTOTYPE_DEFINITION_HEADER@
|
|
||||||
|
|
||||||
static void cmakeRequireSymbol(int dummy, ...) {
|
|
||||||
(void) dummy;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void checkSymbol(void) {
|
|
||||||
#ifndef @CHECK_PROTOTYPE_DEFINITION_SYMBOL@
|
|
||||||
cmakeRequireSymbol(0, &@CHECK_PROTOTYPE_DEFINITION_SYMBOL@);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
@CHECK_PROTOTYPE_DEFINITION_PROTO@ {
|
|
||||||
return @CHECK_PROTOTYPE_DEFINITION_RETURN@;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __CLASSIC_C__
|
|
||||||
int main() {
|
|
||||||
int ac;
|
|
||||||
char*av[];
|
|
||||||
#else
|
|
||||||
int main(int ac, char *av[]) {
|
|
||||||
#endif
|
|
||||||
checkSymbol();
|
|
||||||
if (ac > 1000) {
|
|
||||||
return *av[0];
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,98 +0,0 @@
|
||||||
# - Check if the protoype we expect is correct.
|
|
||||||
# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
|
|
||||||
# FUNCTION - The name of the function (used to check if prototype exists)
|
|
||||||
# PROTOTYPE- The prototype to check.
|
|
||||||
# RETURN - The return value of the function.
|
|
||||||
# HEADER - The header files required.
|
|
||||||
# VARIABLE - The variable to store the result.
|
|
||||||
# Example:
|
|
||||||
# check_prototype_definition(getpwent_r
|
|
||||||
# "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
|
|
||||||
# "NULL"
|
|
||||||
# "unistd.h;pwd.h"
|
|
||||||
# SOLARIS_GETPWENT_R)
|
|
||||||
# The following variables may be set before calling this macro to
|
|
||||||
# modify the way the check is run:
|
|
||||||
#
|
|
||||||
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
|
||||||
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
|
||||||
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
|
||||||
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Copyright 2005-2009 Kitware, Inc.
|
|
||||||
# Copyright 2010-2011 Andreas Schneider <asn@cryptomilk.org>
|
|
||||||
#
|
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
|
||||||
# see accompanying file Copyright.txt for details.
|
|
||||||
#
|
|
||||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
||||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the License for more information.
|
|
||||||
#=============================================================================
|
|
||||||
# (To distribute this file outside of CMake, substitute the full
|
|
||||||
# License text for the above reference.)
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
get_filename_component(__check_proto_def_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
|
||||||
|
|
||||||
|
|
||||||
function(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE)
|
|
||||||
|
|
||||||
if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$")
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n")
|
|
||||||
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
|
||||||
if (CMAKE_REQUIRED_LIBRARIES)
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS
|
|
||||||
LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
|
|
||||||
else()
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS)
|
|
||||||
endif()
|
|
||||||
if (CMAKE_REQUIRED_INCLUDES)
|
|
||||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES
|
|
||||||
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
foreach(_FILE ${_HEADER})
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_HEADER
|
|
||||||
"${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION})
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE})
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN})
|
|
||||||
|
|
||||||
configure_file("${__check_proto_def_dir}/CheckPrototypeDefinition.c.in"
|
|
||||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY)
|
|
||||||
|
|
||||||
file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE)
|
|
||||||
|
|
||||||
try_compile(${_VARIABLE}
|
|
||||||
${CMAKE_BINARY_DIR}
|
|
||||||
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c
|
|
||||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
|
||||||
${CHECK_PROTOTYPE_DEFINITION_LIBS}
|
|
||||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS}
|
|
||||||
"${CMAKE_SYMBOL_EXISTS_INCLUDES}"
|
|
||||||
OUTPUT_VARIABLE OUTPUT)
|
|
||||||
|
|
||||||
if (${_VARIABLE})
|
|
||||||
set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
|
||||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True")
|
|
||||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
|
||||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n"
|
|
||||||
"${OUTPUT}\n\n")
|
|
||||||
else ()
|
|
||||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False")
|
|
||||||
set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
|
||||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
|
||||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n"
|
|
||||||
"${OUTPUT}\n\n${_SOURCE}\n\n")
|
|
||||||
endif ()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endfunction()
|
|
|
@ -1,98 +0,0 @@
|
||||||
# - Check if the protoype we expect is correct.
|
|
||||||
# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
|
|
||||||
# FUNCTION - The name of the function (used to check if prototype exists)
|
|
||||||
# PROTOTYPE- The prototype to check.
|
|
||||||
# RETURN - The return value of the function.
|
|
||||||
# HEADER - The header files required.
|
|
||||||
# VARIABLE - The variable to store the result.
|
|
||||||
# Example:
|
|
||||||
# check_prototype_definition(getpwent_r
|
|
||||||
# "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
|
|
||||||
# "NULL"
|
|
||||||
# "unistd.h;pwd.h"
|
|
||||||
# SOLARIS_GETPWENT_R)
|
|
||||||
# The following variables may be set before calling this macro to
|
|
||||||
# modify the way the check is run:
|
|
||||||
#
|
|
||||||
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
|
||||||
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
|
||||||
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
|
||||||
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
|
||||||
|
|
||||||
#=============================================================================
|
|
||||||
# Copyright 2005-2009 Kitware, Inc.
|
|
||||||
# Copyright 2010-2011 Andreas Schneider <asn@cryptomilk.org>
|
|
||||||
#
|
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
|
||||||
# see accompanying file Copyright.txt for details.
|
|
||||||
#
|
|
||||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
|
||||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the License for more information.
|
|
||||||
#=============================================================================
|
|
||||||
# (To distribute this file outside of CMake, substitute the full
|
|
||||||
# License text for the above reference.)
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
get_filename_component(__check_proto_def_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
|
||||||
|
|
||||||
|
|
||||||
function(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE)
|
|
||||||
|
|
||||||
if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$")
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n")
|
|
||||||
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
|
||||||
if (CMAKE_REQUIRED_LIBRARIES)
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS
|
|
||||||
${LINK_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES})
|
|
||||||
else()
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS)
|
|
||||||
endif()
|
|
||||||
if (CMAKE_REQUIRED_INCLUDES)
|
|
||||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES
|
|
||||||
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
foreach(_FILE ${_HEADER})
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_HEADER
|
|
||||||
"${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION})
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE})
|
|
||||||
set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN})
|
|
||||||
|
|
||||||
configure_file("${__check_proto_def_dir}/CheckPrototypeDefinition.c.in"
|
|
||||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY)
|
|
||||||
|
|
||||||
file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE)
|
|
||||||
|
|
||||||
try_compile(${_VARIABLE}
|
|
||||||
${CMAKE_BINARY_DIR}
|
|
||||||
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c
|
|
||||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
|
||||||
${CHECK_PROTOTYPE_DEFINITION_LIBS}
|
|
||||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS}
|
|
||||||
"${CMAKE_SYMBOL_EXISTS_INCLUDES}"
|
|
||||||
OUTPUT_VARIABLE OUTPUT)
|
|
||||||
|
|
||||||
if (${_VARIABLE})
|
|
||||||
set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
|
||||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True")
|
|
||||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
|
||||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n"
|
|
||||||
"${OUTPUT}\n\n")
|
|
||||||
else ()
|
|
||||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False")
|
|
||||||
set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
|
||||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
|
||||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n"
|
|
||||||
"${OUTPUT}\n\n${_SOURCE}\n\n")
|
|
||||||
endif ()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endfunction()
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
FindFFMPEG
|
||||||
|
----------
|
||||||
|
|
||||||
|
Find the FFmpeg and associated libraries.
|
||||||
|
|
||||||
|
|
||||||
|
This module accepts following COMPONENTS::
|
||||||
|
|
||||||
|
avcodec
|
||||||
|
avdevice
|
||||||
|
avfilter
|
||||||
|
avformat
|
||||||
|
avutil
|
||||||
|
swresample
|
||||||
|
swscale
|
||||||
|
|
||||||
|
IMPORTED Targets
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following :prop_tgt:`IMPORTED` targets:
|
||||||
|
|
||||||
|
``FFMPEG::<component>``
|
||||||
|
The FFmpeg component.
|
||||||
|
|
||||||
|
Result Variables
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
``FFMPEG_INCLUDE_DIRS``
|
||||||
|
Include directories necessary to use FFmpeg.
|
||||||
|
``FFMPEG_LIBRARIES``
|
||||||
|
Libraries necessary to use FFmpeg. Note that this only includes libraries for the components requested.
|
||||||
|
``FFMPEG_VERSION``
|
||||||
|
The version of FFMPEG found (avutil).
|
||||||
|
|
||||||
|
|
||||||
|
For each component, the following are provided:
|
||||||
|
|
||||||
|
``FFMPEG_<component>_FOUND``
|
||||||
|
FFmpeg component was found.
|
||||||
|
``FFMPEG_<component>_INCLUDE_DIRS``
|
||||||
|
Include directories for the component.
|
||||||
|
``FFMPEG_<component>_LIBRARIES``
|
||||||
|
Libraries for the component.
|
||||||
|
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
function(_ffmpeg_find component pkgconfig_name header)
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_check_modules(PC_FFMPEG_${component} ${pkgconfig_name})
|
||||||
|
|
||||||
|
find_path(FFMPEG_${component}_INCLUDE_DIR
|
||||||
|
NAMES "lib${component}/${header}"
|
||||||
|
HINTS
|
||||||
|
${PC_FFMPEG_${component}_INCLUDEDIR}
|
||||||
|
${PC_FFMPEG_${component}_INCLUDE_DIRS}
|
||||||
|
PATH_SUFFIXES
|
||||||
|
ffmpeg)
|
||||||
|
mark_as_advanced("FFMPEG_${component}_INCLUDE_DIR")
|
||||||
|
|
||||||
|
find_library(FFMPEG_${component}_LIBRARY
|
||||||
|
NAMES
|
||||||
|
${component}
|
||||||
|
${PC_FFMPEG_${component}_LIBRARIES}
|
||||||
|
HINTS
|
||||||
|
${PC_FFMPEG_${component}_LIBDIR}
|
||||||
|
${PC_FFMPEG_${component}_LIBRARY_DIRS})
|
||||||
|
mark_as_advanced("${component}_LIBRARY")
|
||||||
|
|
||||||
|
if(FFMPEG_${component}_LIBRARY AND FFMPEG_${component}_INCLUDE_DIR)
|
||||||
|
set(_deps_found TRUE)
|
||||||
|
set(_deps_link)
|
||||||
|
foreach(_ffmpeg_dep IN LISTS ARGN)
|
||||||
|
if(TARGET "FFMPEG::${_ffmpeg_dep}")
|
||||||
|
list(APPEND _deps_link "FFMPEG::${_ffmpeg_dep}")
|
||||||
|
else()
|
||||||
|
set(_deps_found FALSE)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
if(_deps_found)
|
||||||
|
if(NOT TARGET "FFMPEG::${component}")
|
||||||
|
add_library("FFMPEG::${component}" UNKNOWN IMPORTED)
|
||||||
|
set_target_properties("FFMPEG::${component}" PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${FFMPEG_${component}_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_${component}_INCLUDE_DIR}"
|
||||||
|
IMPORTED_LINK_INTERFACE_LIBRARIES "${_deps_link}")
|
||||||
|
endif()
|
||||||
|
set(FFMPEG_${component}_FOUND 1 PARENT_SCOPE)
|
||||||
|
set(FFMPEG_${component}_VERSION "${PC_FFMPEG_${component}_VERSION}" PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
set("FFMPEG_${component}_FOUND" 0 PARENT_SCOPE)
|
||||||
|
set(what)
|
||||||
|
if(NOT FFMPEG_${component}_LIBRARY)
|
||||||
|
set(what "library")
|
||||||
|
endif()
|
||||||
|
if(NOT FFMPEG_${component}_INCLUDE_DIR)
|
||||||
|
if(what)
|
||||||
|
string(APPEND what " or headers")
|
||||||
|
else()
|
||||||
|
set(what "headers")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
set("FFMPEG_${component}_NOT_FOUND_MESSAGE"
|
||||||
|
"Could not find the ${what} for ${component}."
|
||||||
|
PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
_ffmpeg_find(avutil libavutil avutil.h)
|
||||||
|
_ffmpeg_find(swresample libswresample swresample.h
|
||||||
|
avutil)
|
||||||
|
_ffmpeg_find(swscale libswscale swscale.h
|
||||||
|
avutil)
|
||||||
|
_ffmpeg_find(avcodec libavcodec avcodec.h
|
||||||
|
avutil)
|
||||||
|
_ffmpeg_find(avformat libavformat avformat.h
|
||||||
|
avcodec avutil)
|
||||||
|
_ffmpeg_find(avfilter libavfilter avfilter.h
|
||||||
|
avutil)
|
||||||
|
_ffmpeg_find(avdevice libavdevice avdevice.h
|
||||||
|
avformat avutil)
|
||||||
|
|
||||||
|
if(TARGET FFMPEG::avutil)
|
||||||
|
set(FFMPEG_VERSION "${FFMPEG_avutil_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(FFMPEG_INCLUDE_DIRS)
|
||||||
|
set(FFMPEG_LIBRARIES)
|
||||||
|
set(_ffmpeg_required_vars)
|
||||||
|
foreach(_ffmpeg_component IN LISTS FFMPEG_FIND_COMPONENTS)
|
||||||
|
if(TARGET "FFMPEG::${_ffmpeg_component}")
|
||||||
|
set(FFMPEG_${_ffmpeg_component}_INCLUDE_DIRS
|
||||||
|
"${FFMPEG_${_ffmpeg_component}_INCLUDE_DIR}")
|
||||||
|
set(FFMPEG_${_ffmpeg_component}_LIBRARIES
|
||||||
|
"${FFMPEG_${_ffmpeg_component}_LIBRARY}")
|
||||||
|
list(APPEND FFMPEG_INCLUDE_DIRS
|
||||||
|
"${FFMPEG_${_ffmpeg_component}_INCLUDE_DIRS}")
|
||||||
|
list(APPEND FFMPEG_LIBRARIES
|
||||||
|
"${FFMPEG_${_ffmpeg_component}_LIBRARIES}")
|
||||||
|
if(FFMEG_FIND_REQUIRED_${_ffmpeg_component})
|
||||||
|
list(APPEND _ffmpeg_required_vars
|
||||||
|
"FFMPEG_${_ffmpeg_required_vars}_INCLUDE_DIRS"
|
||||||
|
"FFMPEG_${_ffmpeg_required_vars}_LIBRARIES")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
unset(_ffmpeg_component)
|
||||||
|
|
||||||
|
if(FFMPEG_INCLUDE_DIRS)
|
||||||
|
list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(FFMPEG
|
||||||
|
REQUIRED_VARS
|
||||||
|
FFMPEG_INCLUDE_DIRS
|
||||||
|
FFMPEG_LIBRARIES
|
||||||
|
${_ffmpeg_required_vars}
|
||||||
|
VERSION_VAR
|
||||||
|
FFMPEG_VERSION
|
||||||
|
HANDLE_COMPONENTS)
|
||||||
|
unset(_ffmpeg_required_vars)
|
|
@ -1,28 +1,89 @@
|
||||||
include(FindPackageHandleStandardArgs)
|
#[=======================================================================[.rst:
|
||||||
|
FindLibJWT
|
||||||
|
----------
|
||||||
|
|
||||||
|
Find the JWT C Library (libjwt)
|
||||||
|
|
||||||
|
|
||||||
|
This module accepts optional COMPONENTS to select the crypto backend (these are mutually exclusive)::
|
||||||
|
|
||||||
|
openssl (default)
|
||||||
|
gnutls
|
||||||
|
|
||||||
|
IMPORTED Targets
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following :prop_tgt:`IMPORTED` targets:
|
||||||
|
|
||||||
|
``JWT::libjwt``
|
||||||
|
The JWT library, if found with the specified crypto backend.
|
||||||
|
|
||||||
|
Result Variables
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
``LIBJWT_FOUND``
|
||||||
|
System has libjwt
|
||||||
|
``LIBJWT_INCLUDE_DIRS``
|
||||||
|
The libjwt include directory
|
||||||
|
``LIBJWT_LIBRARIES``
|
||||||
|
The libraries needed to use libjwt
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package(PkgConfig QUIET)
|
find_package(PkgConfig QUIET)
|
||||||
|
|
||||||
|
if(LibJWT_FIND_COMPONENTS)
|
||||||
|
set(LIBJWT_CRYPTO_BACKEND "")
|
||||||
|
foreach(component IN LISTS LibJWT_FIND_COMPONENTS)
|
||||||
|
if(component MATCHES "^(openssl|gnutls)")
|
||||||
|
if(LIBJWT_CRYPTO_BACKEND)
|
||||||
|
message(FATAL_ERROR "LibJWT: Only one crypto library can be selected.")
|
||||||
|
endif()
|
||||||
|
set(LIBJWT_CRYPTO_BACKEND ${component})
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "LibJWT: Wrong crypto backend specified.")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
else()
|
||||||
|
set(LIBJWT_CRYPTO_BACKEND "openssl")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LIBJWT_LIB_NAMES "")
|
||||||
|
if(LIBJWT_CRYPTO_BACKEND STREQUAL "openssl")
|
||||||
|
set(LIBJWT_LIB_NAMES "jwt" "libjwt")
|
||||||
|
elseif(LIBJWT_CRYPTO_BACKEND STREQUAL "gnutls")
|
||||||
|
set(LIBJWT_LIB_NAMES "jwt-gnutls" "libjwt-gnutls")
|
||||||
|
endif()
|
||||||
|
|
||||||
pkg_check_modules(PC_LIBJWT QUIET libjwt)
|
pkg_check_modules(PC_LIBJWT QUIET libjwt)
|
||||||
|
|
||||||
find_path(LIBJWT_INCLUDE_DIR
|
find_path(LIBJWT_INCLUDE_DIR
|
||||||
NAMES jwt.h
|
NAMES jwt.h
|
||||||
HINTS ${PC_LIBJWT_INCLUDEDIR} ${PC_LIBJWT_INCLUDE_DIRS}
|
HINTS
|
||||||
)
|
${PC_LIBJWT_INCLUDEDIR}
|
||||||
|
${PC_LIBJWT_INCLUDE_DIRS})
|
||||||
|
mark_as_advanced(LIBJWT_INCLUDE_DIR)
|
||||||
|
|
||||||
find_library(LIBJWT_LIBRARY
|
find_library(LIBJWT_LIBRARY
|
||||||
NAMES jwt-gnutls libjwt-gnutls liblibjwt-gnutls
|
NAMES ${LIBJWT_LIB_NAMES}
|
||||||
HINTS ${PC_LIBJWT_LIBDIR} ${PC_LIBJWT_LIBRARY_DIR}
|
HINTS
|
||||||
)
|
${PC_LIBJWT_LIBDIR}
|
||||||
|
${PC_LIBJWT_LIBRARY_DIR})
|
||||||
|
mark_as_advanced(LIBJWT_LIBRARY)
|
||||||
|
|
||||||
find_package_handle_standard_args(LibJWT
|
find_package_handle_standard_args(LibJWT
|
||||||
REQUIRED_VARS LIBJWT_INCLUDE_DIR LIBJWT_LIBRARY
|
REQUIRED_VARS
|
||||||
)
|
LIBJWT_INCLUDE_DIR
|
||||||
|
LIBJWT_LIBRARY
|
||||||
|
FAIL_MESSAGE
|
||||||
|
"Could NOT find LibJWT with the crypto backend ${LIBJWT_CRYPTO_BACKEND}.")
|
||||||
|
|
||||||
if(LIBJWT_FOUND)
|
if(LIBJWT_FOUND)
|
||||||
add_library(libjwt STATIC IMPORTED GLOBAL)
|
set(LIBJWT_LIBRARIES ${LIBJWT_LIBRARY})
|
||||||
set_target_properties(libjwt PROPERTIES
|
set(LIBJWT_INCLUDE_DIRS ${LIBJWT_INCLUDE_DIR})
|
||||||
IMPORTED_LOCATION "${LIBJWT_LIBRARY}"
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBJWT_INCLUDE_DIR}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mark_as_advanced(LIBJWT_INCLUDE_DIR LIBJWT_LIBRARY)
|
add_library(JWT::libjwt UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(JWT::libjwt PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBJWT_INCLUDE_DIRS}"
|
||||||
|
IMPORTED_LOCATION "${LIBJWT_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
# Try to find Live555 libraries
|
|
||||||
# Once done this will define
|
|
||||||
# Live555_FOUND
|
|
||||||
# Live555_INCLUDE_DIRS
|
|
||||||
# Live555_LIBRARIES
|
|
||||||
|
|
||||||
if (NOT Live555_FOUND)
|
|
||||||
set(_Live555_FOUND ON)
|
|
||||||
|
|
||||||
foreach (library liveMedia BasicUsageEnvironment Groupsock UsageEnvironment)
|
|
||||||
|
|
||||||
string(TOLOWER ${library} lowercase_library)
|
|
||||||
|
|
||||||
find_path(Live555_${library}_INCLUDE_DIR
|
|
||||||
NAMES
|
|
||||||
${library}.hh
|
|
||||||
${lowercase_library}.hh
|
|
||||||
PATHS
|
|
||||||
${Live555_ROOT}/${library}/include
|
|
||||||
${Live555_ROOT}/live/${library}/include
|
|
||||||
/usr/include/${library}
|
|
||||||
/usr/local/include/${library}
|
|
||||||
/usr/include/${lowercase_library}
|
|
||||||
/usr/local/include/${lowercase_library}
|
|
||||||
)
|
|
||||||
|
|
||||||
if (Live555_${library}_INCLUDE_DIR)
|
|
||||||
list(APPEND _Live555_INCLUDE_DIRS ${Live555_${library}_INCLUDE_DIR})
|
|
||||||
else()
|
|
||||||
set(_Live555_FOUND OFF)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
foreach (mode DEBUG RELEASE)
|
|
||||||
find_library(Live555_${library}_LIBRARY_${mode}
|
|
||||||
NAMES
|
|
||||||
${library}
|
|
||||||
${lowercase_library}
|
|
||||||
PATHS
|
|
||||||
${Live555_ROOT}/lib/${mode}
|
|
||||||
${Live555_ROOT}/${library}
|
|
||||||
)
|
|
||||||
if (Live555_${library}_LIBRARY_${mode})
|
|
||||||
if (${mode} STREQUAL RELEASE)
|
|
||||||
list(APPEND _Live555_LIBRARIES optimized ${Live555_${library}_LIBRARY_${mode}})
|
|
||||||
elseif (${mode} STREQUAL DEBUG)
|
|
||||||
list(APPEND _Live555_LIBRARIES debug ${Live555_${library}_LIBRARY_${mode}})
|
|
||||||
else ()
|
|
||||||
MESSAGE(STATUS no)
|
|
||||||
list(APPEND _Live555_LIBRARIES ${Live555_${library}_LIBRARY_${mode}})
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(_Live555_FOUND OFF)
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
if (_Live555_FOUND)
|
|
||||||
set(Live555_INCLUDE_DIRS ${_Live555_INCLUDE_DIRS} CACHE INTERNAL "")
|
|
||||||
set(Live555_LIBRARIES ${_Live555_LIBRARIES} CACHE INTERNAL "")
|
|
||||||
set(Live555_FOUND ${_Live555_FOUND} CACHE BOOL "" FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LOGGING_FOUND to TRUE
|
|
||||||
# if all listed variables are TRUE
|
|
||||||
find_package_handle_standard_args(Live555 DEFAULT_MSG Live555_INCLUDE_DIRS Live555_LIBRARIES Live555_FOUND)
|
|
||||||
|
|
||||||
# Tell cmake GUIs to ignore the "local" variables.
|
|
||||||
mark_as_advanced(Live555_INCLUDE_DIRS Live555_LIBRARIES Live555_FOUND)
|
|
||||||
endif (NOT Live555_FOUND)
|
|
||||||
|
|
||||||
if (Live555_FOUND)
|
|
||||||
message(STATUS "Found live555")
|
|
||||||
endif()
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
FindV4L2
|
||||||
|
----------
|
||||||
|
|
||||||
|
Find V4L2 headers and libv4l2
|
||||||
|
|
||||||
|
|
||||||
|
This module accepts optional COMPONENTS:
|
||||||
|
|
||||||
|
videodev2 (default)
|
||||||
|
libv4l2
|
||||||
|
|
||||||
|
IMPORTED Targets
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following :prop_tgt:`IMPORTED` targets::
|
||||||
|
|
||||||
|
``V4L2::videodev2``
|
||||||
|
The Video for Linux Two header file, if found.
|
||||||
|
``V4L2::libv4l2``
|
||||||
|
A thin abstraction layer on top of video4linux2 devices, if found.
|
||||||
|
|
||||||
|
Result Variables
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
``V4L2_FOUND``
|
||||||
|
System has v4l2 support. If no components are specified only the videodev2.h header has to be found.
|
||||||
|
``V4L2_INCLUDE_DIRS``
|
||||||
|
The v4l2 include directories.
|
||||||
|
``V4L2_LIBRARIES``
|
||||||
|
The libraries needed to have v4l2 support according to the specified components.
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
find_path(V4L2_VIDEODEV2_INCLUDE_DIR
|
||||||
|
NAMES linux/videodev2.h)
|
||||||
|
mark_as_advanced(V4L2_VIDEODEV2_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if(EXISTS "${V4L2_VIDEODEV2_INCLUDE_DIR}")
|
||||||
|
set(V4L2_videodev2_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
set(V4L2_videodev2_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
pkg_check_modules(PC_V4L2_LIBV4L2 QUIET libv4l2)
|
||||||
|
|
||||||
|
find_path(V4L2_LIBV4L2_INCLUDE_DIR
|
||||||
|
NAMES libv4l2.h
|
||||||
|
HINTS
|
||||||
|
${PC_V4L2_LIBV4L2_INCLUDEDIR}
|
||||||
|
${PC_V4L2_LIBV4L2_INCLUDE_DIRS})
|
||||||
|
mark_as_advanced(V4L2_LIBV4L2_INCLUDE_DIR)
|
||||||
|
|
||||||
|
find_library(V4L2_LIBV4L2_LIBRARY
|
||||||
|
NAMES ${PC_V4L2_LIBV4L2_LIBRARIES}
|
||||||
|
HINTS
|
||||||
|
${PC_V4L2_LIBV4L2_LIBDIR}
|
||||||
|
${PC_V4L2_LIBV4L2_LIBRARY_DIR})
|
||||||
|
mark_as_advanced(V4L2_LIBV4L2_LIBRARY)
|
||||||
|
|
||||||
|
if(EXISTS "${V4L2_LIBV4L2_INCLUDE_DIR}" AND
|
||||||
|
EXISTS "${V4L2_LIBV4L2_LIBRARY}")
|
||||||
|
set(V4L2_libv4l2_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
set(V4L2_libv4l2_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(V4L2
|
||||||
|
REQUIRED_VARS
|
||||||
|
V4L2_VIDEODEV2_INCLUDE_DIR
|
||||||
|
HANDLE_COMPONENTS)
|
||||||
|
|
||||||
|
set(V4L2_INCLUDE_DIRS)
|
||||||
|
set(V4L2_LIBRARIES)
|
||||||
|
|
||||||
|
if(V4L2_videodev2_FOUND)
|
||||||
|
set(V4L2_VIDEODEV2_INCLUDE_DIRS ${V4L2_VIDEODEV2_INCLUDE_DIR})
|
||||||
|
list(APPEND V4L2_INCLUDE2_DIRS
|
||||||
|
"${V4L2_VIDEODEV2_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
add_library(V4L2::videodev2 INTERFACE IMPORTED)
|
||||||
|
set_target_properties(V4L2::videodev2 PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${V4L2_VIDEODEV2_INCLUDE_DIRS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(V4L2_libv4l2_FOUND)
|
||||||
|
set(V4L2_LIBV4L2_INCLUDE_DIRS ${V4L2_LIBV4L2_INCLUDE_DIR})
|
||||||
|
set(V4L2_LIBV4L2_LIBRARIES ${V4L2_LIBV4L2_LIBRARY})
|
||||||
|
|
||||||
|
list(APPEND V4L2_INCLUDE_DIRS
|
||||||
|
"${V4L2_LIBV4L2_INCLUDE_DIRS}")
|
||||||
|
list(APPEND V4L2_LIBRARIES
|
||||||
|
"${V4L2_LIBV4L2_LIBRARIES}")
|
||||||
|
|
||||||
|
add_library(V4L2::libv4l2 UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(V4L2::libv4l2 PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${V4L2_LIBV4L2_INCLUDE_DIRS}"
|
||||||
|
IMPORTED_LOCATION "${V4L2_LIBV4L2_LIBRARY}")
|
||||||
|
endif()
|
|
@ -2,7 +2,15 @@ target_compile_options(zm-warning-interface
|
||||||
INTERFACE
|
INTERFACE
|
||||||
-Wall
|
-Wall
|
||||||
-Wextra
|
-Wextra
|
||||||
-Wno-unused-parameter)
|
-Wimplicit-fallthrough
|
||||||
|
-Wno-unused-parameter
|
||||||
|
-Wvla)
|
||||||
|
|
||||||
|
if(ENABLE_WERROR)
|
||||||
|
target_compile_options(zm-warning-interface
|
||||||
|
INTERFACE
|
||||||
|
-Werror)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ASAN)
|
if(ASAN)
|
||||||
target_compile_options(zm-compile-option-interface
|
target_compile_options(zm-compile-option-interface
|
||||||
|
|
|
@ -1,18 +1,31 @@
|
||||||
target_compile_options(zm-warning-interface
|
target_compile_options(zm-warning-interface
|
||||||
INTERFACE
|
INTERFACE
|
||||||
-Wall
|
-Wall
|
||||||
|
$<$<VERSION_GREATER:$<CXX_COMPILER_VERSION>,5.0>:-Wconditionally-supported>
|
||||||
-Wextra
|
-Wextra
|
||||||
|
-Wformat-security
|
||||||
-Wno-cast-function-type
|
-Wno-cast-function-type
|
||||||
-Wno-type-limits
|
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,11>:-Wno-clobbered>
|
||||||
-Wno-unused-parameter)
|
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,5.1>:-Wno-missing-field-initializers>
|
||||||
|
-Wno-unused-parameter
|
||||||
|
-Woverloaded-virtual
|
||||||
|
-Wvla)
|
||||||
|
|
||||||
|
if(ENABLE_WERROR)
|
||||||
|
target_compile_options(zm-warning-interface
|
||||||
|
INTERFACE
|
||||||
|
-Werror)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(ASAN)
|
if(ASAN)
|
||||||
target_compile_options(zm-compile-option-interface
|
target_compile_options(zm-compile-option-interface
|
||||||
INTERFACE
|
INTERFACE
|
||||||
|
-D_GLIBCXX_SANITIZE_VECTOR=1
|
||||||
-fno-omit-frame-pointer
|
-fno-omit-frame-pointer
|
||||||
-fsanitize=address
|
-fsanitize=address
|
||||||
-fsanitize-recover=address
|
-fsanitize-recover=address
|
||||||
-fsanitize-address-use-after-scope)
|
-fsanitize-address-use-after-scope
|
||||||
|
-Wno-stringop-truncation)
|
||||||
|
|
||||||
target_link_options(zm-compile-option-interface
|
target_link_options(zm-compile-option-interface
|
||||||
INTERFACE
|
INTERFACE
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
# Create files from the .in files
|
# Create files from the .in files
|
||||||
configure_file(zm_create.sql.in "${CMAKE_CURRENT_BINARY_DIR}/zm_create.sql" @ONLY)
|
configure_file(zm_create.sql.in "${CMAKE_CURRENT_BINARY_DIR}/zm_create.sql" @ONLY)
|
||||||
configure_file(zm_update-1.31.30.sql.in "${CMAKE_CURRENT_BINARY_DIR}/zm_update-1.31.30.sql" @ONLY)
|
configure_file(zm_update-1.31.30.sql.in "${CMAKE_CURRENT_BINARY_DIR}/zm_update-1.31.30.sql" @ONLY)
|
||||||
|
configure_file(zm_update-1.35.24.sql.in "${CMAKE_CURRENT_BINARY_DIR}/zm_update-1.35.24.sql" @ONLY)
|
||||||
|
|
||||||
# Glob all database upgrade scripts
|
# Glob all database upgrade scripts
|
||||||
file(GLOB dbfileslist RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "zm_update-*.sql")
|
file(GLOB dbfileslist RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "zm_update-*.sql")
|
||||||
|
@ -12,6 +13,8 @@ install(FILES ${dbfileslist} DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/db
|
||||||
|
|
||||||
# install zm_update-1.31.30.sql
|
# install zm_update-1.31.30.sql
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm_update-1.31.30.sql" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/db")
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm_update-1.31.30.sql" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/db")
|
||||||
|
# install zm_update-1.35.24.sql
|
||||||
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm_update-1.35.24.sql" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/db")
|
||||||
|
|
||||||
# install zm_create.sql
|
# install zm_create.sql
|
||||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm_create.sql" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/db")
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/zm_create.sql" DESTINATION "${CMAKE_INSTALL_DATADIR}/zoneminder/db")
|
||||||
|
|
|
@ -3,10 +3,10 @@ delimiter //
|
||||||
DROP TRIGGER IF EXISTS Events_Hour_delete_trigger//
|
DROP TRIGGER IF EXISTS Events_Hour_delete_trigger//
|
||||||
CREATE TRIGGER Events_Hour_delete_trigger BEFORE DELETE ON Events_Hour
|
CREATE TRIGGER Events_Hour_delete_trigger BEFORE DELETE ON Events_Hour
|
||||||
FOR EACH ROW BEGIN
|
FOR EACH ROW BEGIN
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
HourEvents = GREATEST(COALESCE(HourEvents,1)-1,0),
|
HourEvents = GREATEST(COALESCE(HourEvents,1)-1,0),
|
||||||
HourEventDiskSpace=GREATEST(COALESCE(HourEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
HourEventDiskSpace=GREATEST(COALESCE(HourEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END;
|
END;
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -20,10 +20,10 @@ FOR EACH ROW
|
||||||
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
IF ( diff ) THEN
|
IF ( diff ) THEN
|
||||||
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
UPDATE Monitor_Status SET HourEventDiskSpace=GREATEST(COALESCE(HourEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0) WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
UPDATE Event_Summaries SET HourEventDiskSpace=GREATEST(COALESCE(HourEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0) WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
UPDATE Monitor_Status SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
ELSE
|
ELSE
|
||||||
UPDATE Monitor_Status SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)+diff WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET HourEventDiskSpace=COALESCE(HourEventDiskSpace,0)+diff WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
|
@ -32,10 +32,10 @@ FOR EACH ROW
|
||||||
DROP TRIGGER IF EXISTS Events_Day_delete_trigger//
|
DROP TRIGGER IF EXISTS Events_Day_delete_trigger//
|
||||||
CREATE TRIGGER Events_Day_delete_trigger BEFORE DELETE ON Events_Day
|
CREATE TRIGGER Events_Day_delete_trigger BEFORE DELETE ON Events_Day
|
||||||
FOR EACH ROW BEGIN
|
FOR EACH ROW BEGIN
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
DayEvents = GREATEST(COALESCE(DayEvents,1)-1,0),
|
DayEvents = GREATEST(COALESCE(DayEvents,1)-1,0),
|
||||||
DayEventDiskSpace=GREATEST(COALESCE(DayEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
DayEventDiskSpace=GREATEST(COALESCE(DayEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END;
|
END;
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -48,10 +48,10 @@ FOR EACH ROW
|
||||||
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
IF ( diff ) THEN
|
IF ( diff ) THEN
|
||||||
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
UPDATE Monitor_Status SET DayEventDiskSpace=GREATEST(COALESCE(DayEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0) WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
UPDATE Event_Summaries SET DayEventDiskSpace=GREATEST(COALESCE(DayEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0) WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
UPDATE Monitor_Status SET DayEventDiskSpace=COALESCE(DayEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET DayEventDiskSpace=COALESCE(DayEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
ELSE
|
ELSE
|
||||||
UPDATE Monitor_Status SET DayEventDiskSpace=GREATEST(COALESCE(DayEventDiskSpace,0)+diff,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET DayEventDiskSpace=GREATEST(COALESCE(DayEventDiskSpace,0)+diff,0) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
|
@ -61,10 +61,10 @@ FOR EACH ROW
|
||||||
DROP TRIGGER IF EXISTS Events_Week_delete_trigger//
|
DROP TRIGGER IF EXISTS Events_Week_delete_trigger//
|
||||||
CREATE TRIGGER Events_Week_delete_trigger BEFORE DELETE ON Events_Week
|
CREATE TRIGGER Events_Week_delete_trigger BEFORE DELETE ON Events_Week
|
||||||
FOR EACH ROW BEGIN
|
FOR EACH ROW BEGIN
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
WeekEvents = GREATEST(COALESCE(WeekEvents,1)-1,0),
|
WeekEvents = GREATEST(COALESCE(WeekEvents,1)-1,0),
|
||||||
WeekEventDiskSpace=GREATEST(COALESCE(WeekEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
WeekEventDiskSpace=GREATEST(COALESCE(WeekEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END;
|
END;
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -77,10 +77,10 @@ FOR EACH ROW
|
||||||
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
IF ( diff ) THEN
|
IF ( diff ) THEN
|
||||||
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
UPDATE Monitor_Status SET WeekEventDiskSpace=GREATEST(COALESCE(WeekEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0) WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
UPDATE Event_Summaries SET WeekEventDiskSpace=GREATEST(COALESCE(WeekEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0) WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
UPDATE Monitor_Status SET WeekEventDiskSpace=COALESCE(WeekEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET WeekEventDiskSpace=COALESCE(WeekEventDiskSpace,0)+COALESCE(NEW.DiskSpace,0) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
ELSE
|
ELSE
|
||||||
UPDATE Monitor_Status SET WeekEventDiskSpace=GREATEST(COALESCE(WeekEventDiskSpace,0)+diff,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET WeekEventDiskSpace=GREATEST(COALESCE(WeekEventDiskSpace,0)+diff,0) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
|
@ -89,10 +89,10 @@ FOR EACH ROW
|
||||||
DROP TRIGGER IF EXISTS Events_Month_delete_trigger//
|
DROP TRIGGER IF EXISTS Events_Month_delete_trigger//
|
||||||
CREATE TRIGGER Events_Month_delete_trigger BEFORE DELETE ON Events_Month
|
CREATE TRIGGER Events_Month_delete_trigger BEFORE DELETE ON Events_Month
|
||||||
FOR EACH ROW BEGIN
|
FOR EACH ROW BEGIN
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
MonthEvents = GREATEST(COALESCE(MonthEvents,1)-1,0),
|
MonthEvents = GREATEST(COALESCE(MonthEvents,1)-1,0),
|
||||||
MonthEventDiskSpace=GREATEST(COALESCE(MonthEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
MonthEventDiskSpace=GREATEST(COALESCE(MonthEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END;
|
END;
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -105,10 +105,10 @@ FOR EACH ROW
|
||||||
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
set diff = COALESCE(NEW.DiskSpace,0) - COALESCE(OLD.DiskSpace,0);
|
||||||
IF ( diff ) THEN
|
IF ( diff ) THEN
|
||||||
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
IF ( NEW.MonitorID != OLD.MonitorID ) THEN
|
||||||
UPDATE Monitor_Status SET MonthEventDiskSpace=GREATEST(COALESCE(MonthEventDiskSpace,0)-COALESCE(OLD.DiskSpace),0) WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
UPDATE Event_Summaries SET MonthEventDiskSpace=GREATEST(COALESCE(MonthEventDiskSpace,0)-COALESCE(OLD.DiskSpace),0) WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
UPDATE Monitor_Status SET MonthEventDiskSpace=COALESCE(MonthEventDiskSpace,0)+COALESCE(NEW.DiskSpace) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET MonthEventDiskSpace=COALESCE(MonthEventDiskSpace,0)+COALESCE(NEW.DiskSpace) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
ELSE
|
ELSE
|
||||||
UPDATE Monitor_Status SET MonthEventDiskSpace=GREATEST(COALESCE(MonthEventDiskSpace,0)+diff,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
UPDATE Event_Summaries SET MonthEventDiskSpace=GREATEST(COALESCE(MonthEventDiskSpace,0)+diff,0) WHERE Event_Summaries.MonitorId=NEW.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
|
@ -145,20 +145,21 @@ BEGIN
|
||||||
IF ( NEW.Archived != OLD.Archived ) THEN
|
IF ( NEW.Archived != OLD.Archived ) THEN
|
||||||
IF ( NEW.Archived ) THEN
|
IF ( NEW.Archived ) THEN
|
||||||
INSERT INTO Events_Archived (EventId,MonitorId,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.DiskSpace);
|
INSERT INTO Events_Archived (EventId,MonitorId,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.DiskSpace);
|
||||||
UPDATE Monitor_Status SET ArchivedEvents = COALESCE(ArchivedEvents,0)+1, ArchivedEventDiskSpace = COALESCE(ArchivedEventDiskSpace,0) + COALESCE(NEW.DiskSpace,0) WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
INSERT INTO Event_Summaries (MonitorId,ArchivedEvents,ArchivedEventDiskSpace) VALUES (NEW.MonitorId,1,NEW.DiskSpace) ON DUPLICATE KEY
|
||||||
|
UPDATE ArchivedEvents = COALESCE(ArchivedEvents,0)+1, ArchivedEventDiskSpace = COALESCE(ArchivedEventDiskSpace,0) + COALESCE(NEW.DiskSpace,0);
|
||||||
ELSEIF ( OLD.Archived ) THEN
|
ELSEIF ( OLD.Archived ) THEN
|
||||||
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
||||||
UPDATE Monitor_Status
|
UPDATE Event_Summaries
|
||||||
SET
|
SET
|
||||||
ArchivedEvents = GREATEST(COALESCE(ArchivedEvents,0)-1,0),
|
ArchivedEvents = GREATEST(COALESCE(ArchivedEvents,0)-1,0),
|
||||||
ArchivedEventDiskSpace = GREATEST(COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),0)
|
ArchivedEventDiskSpace = GREATEST(COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
ELSE
|
ELSE
|
||||||
IF ( OLD.DiskSpace != NEW.DiskSpace ) THEN
|
IF ( OLD.DiskSpace != NEW.DiskSpace ) THEN
|
||||||
UPDATE Events_Archived SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
UPDATE Events_Archived SET DiskSpace=NEW.DiskSpace WHERE EventId=NEW.Id;
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
ArchivedEventDiskSpace = GREATEST(COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + COALESCE(NEW.DiskSpace,0),0)
|
ArchivedEventDiskSpace = GREATEST(COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + COALESCE(NEW.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
ELSEIF ( NEW.Archived AND diff ) THEN
|
ELSEIF ( NEW.Archived AND diff ) THEN
|
||||||
|
@ -166,10 +167,10 @@ BEGIN
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF ( diff ) THEN
|
IF ( diff ) THEN
|
||||||
UPDATE Monitor_Status
|
UPDATE Event_Summaries
|
||||||
SET
|
SET
|
||||||
TotalEventDiskSpace = GREATEST(COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + COALESCE(NEW.DiskSpace,0),0)
|
TotalEventDiskSpace = GREATEST(COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0) + COALESCE(NEW.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
END;
|
END;
|
||||||
|
@ -189,13 +190,13 @@ FOR EACH ROW
|
||||||
INSERT INTO Events_Day (EventId,MonitorId,StartDateTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartDateTime,0);
|
INSERT INTO Events_Day (EventId,MonitorId,StartDateTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartDateTime,0);
|
||||||
INSERT INTO Events_Week (EventId,MonitorId,StartDateTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartDateTime,0);
|
INSERT INTO Events_Week (EventId,MonitorId,StartDateTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartDateTime,0);
|
||||||
INSERT INTO Events_Month (EventId,MonitorId,StartDateTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartDateTime,0);
|
INSERT INTO Events_Month (EventId,MonitorId,StartDateTime,DiskSpace) VALUES (NEW.Id,NEW.MonitorId,NEW.StartDateTime,0);
|
||||||
UPDATE Monitor_Status SET
|
INSERT INTO Event_Summaries (MonitorId,HourEvents,DayEvents,WeekEvents,MonthEvents,TotalEvents) VALUES (NEW.MonitorId,1,1,1,1,1) ON DUPLICATE KEY
|
||||||
|
UPDATE
|
||||||
HourEvents = COALESCE(HourEvents,0)+1,
|
HourEvents = COALESCE(HourEvents,0)+1,
|
||||||
DayEvents = COALESCE(DayEvents,0)+1,
|
DayEvents = COALESCE(DayEvents,0)+1,
|
||||||
WeekEvents = COALESCE(WeekEvents,0)+1,
|
WeekEvents = COALESCE(WeekEvents,0)+1,
|
||||||
MonthEvents = COALESCE(MonthEvents,0)+1,
|
MonthEvents = COALESCE(MonthEvents,0)+1,
|
||||||
TotalEvents = COALESCE(TotalEvents,0)+1
|
TotalEvents = COALESCE(TotalEvents,0)+1;
|
||||||
WHERE Monitor_Status.MonitorId=NEW.MonitorId;
|
|
||||||
END;
|
END;
|
||||||
//
|
//
|
||||||
|
|
||||||
|
@ -213,17 +214,17 @@ BEGIN
|
||||||
DELETE FROM Events_Month WHERE EventId=OLD.Id;
|
DELETE FROM Events_Month WHERE EventId=OLD.Id;
|
||||||
IF ( OLD.Archived ) THEN
|
IF ( OLD.Archived ) THEN
|
||||||
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
DELETE FROM Events_Archived WHERE EventId=OLD.Id;
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
ArchivedEvents = GREATEST(COALESCE(ArchivedEvents,1) - 1,0),
|
ArchivedEvents = GREATEST(COALESCE(ArchivedEvents,1) - 1,0),
|
||||||
ArchivedEventDiskSpace = GREATEST(COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),0),
|
ArchivedEventDiskSpace = GREATEST(COALESCE(ArchivedEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),0),
|
||||||
TotalEvents = GREATEST(COALESCE(TotalEvents,1) - 1,0),
|
TotalEvents = GREATEST(COALESCE(TotalEvents,1) - 1,0),
|
||||||
TotalEventDiskSpace = GREATEST(COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),0)
|
TotalEventDiskSpace = GREATEST(COALESCE(TotalEventDiskSpace,0) - COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
ELSE
|
ELSE
|
||||||
UPDATE Monitor_Status SET
|
UPDATE Event_Summaries SET
|
||||||
TotalEvents = GREATEST(COALESCE(TotalEvents,1)-1,0),
|
TotalEvents = GREATEST(COALESCE(TotalEvents,1)-1,0),
|
||||||
TotalEventDiskSpace=GREATEST(COALESCE(TotalEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
TotalEventDiskSpace=GREATEST(COALESCE(TotalEventDiskSpace,0)-COALESCE(OLD.DiskSpace,0),0)
|
||||||
WHERE Monitor_Status.MonitorId=OLD.MonitorId;
|
WHERE Event_Summaries.MonitorId=OLD.MonitorId;
|
||||||
END IF;
|
END IF;
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
|
|
@ -468,6 +468,7 @@ CREATE TABLE `Monitors` (
|
||||||
`Port` varchar(8) NOT NULL default '',
|
`Port` varchar(8) NOT NULL default '',
|
||||||
`SubPath` varchar(64) NOT NULL default '',
|
`SubPath` varchar(64) NOT NULL default '',
|
||||||
`Path` varchar(255),
|
`Path` varchar(255),
|
||||||
|
`SecondPath` varchar(255),
|
||||||
`Options` varchar(255),
|
`Options` varchar(255),
|
||||||
`User` varchar(64),
|
`User` varchar(64),
|
||||||
`Pass` varchar(64),
|
`Pass` varchar(64),
|
||||||
|
@ -482,7 +483,7 @@ CREATE TABLE `Monitors` (
|
||||||
`SaveJPEGs` TINYINT NOT NULL DEFAULT '3' ,
|
`SaveJPEGs` TINYINT NOT NULL DEFAULT '3' ,
|
||||||
`VideoWriter` TINYINT NOT NULL DEFAULT '0',
|
`VideoWriter` TINYINT NOT NULL DEFAULT '0',
|
||||||
`OutputCodec` int(10) unsigned NOT NULL default 0,
|
`OutputCodec` int(10) unsigned NOT NULL default 0,
|
||||||
`Encoder` enum('auto','h264','libx264','h264_omx','h264_vaapi','mjpeg','mpeg1','mpeg2'),
|
`Encoder` varchar(32),
|
||||||
`OutputContainer` enum('auto','mp4','mkv'),
|
`OutputContainer` enum('auto','mp4','mkv'),
|
||||||
`EncoderParameters` TEXT,
|
`EncoderParameters` TEXT,
|
||||||
`RecordAudio` TINYINT NOT NULL DEFAULT '0',
|
`RecordAudio` TINYINT NOT NULL DEFAULT '0',
|
||||||
|
@ -496,11 +497,12 @@ CREATE TABLE `Monitors` (
|
||||||
`LabelX` smallint(5) unsigned NOT NULL default '0',
|
`LabelX` smallint(5) unsigned NOT NULL default '0',
|
||||||
`LabelY` smallint(5) unsigned NOT NULL default '0',
|
`LabelY` smallint(5) unsigned NOT NULL default '0',
|
||||||
`LabelSize` smallint(5) unsigned NOT NULL DEFAULT '1',
|
`LabelSize` smallint(5) unsigned NOT NULL DEFAULT '1',
|
||||||
`ImageBufferCount` smallint(5) unsigned NOT NULL default '100',
|
`ImageBufferCount` smallint(5) unsigned NOT NULL default '3',
|
||||||
`WarmupCount` smallint(5) unsigned NOT NULL default '25',
|
`MaxImageBufferCount` smallint(5) unsigned NOT NULL default '0',
|
||||||
|
`WarmupCount` smallint(5) unsigned NOT NULL default '0',
|
||||||
`PreEventCount` smallint(5) unsigned NOT NULL default '10',
|
`PreEventCount` smallint(5) unsigned NOT NULL default '10',
|
||||||
`PostEventCount` smallint(5) unsigned NOT NULL default '10',
|
`PostEventCount` smallint(5) unsigned NOT NULL default '10',
|
||||||
`StreamReplayBuffer` int(10) unsigned NOT NULL default '1000',
|
`StreamReplayBuffer` int(10) unsigned NOT NULL default '0',
|
||||||
`AlarmFrameCount` smallint(5) unsigned NOT NULL default '1',
|
`AlarmFrameCount` smallint(5) unsigned NOT NULL default '1',
|
||||||
`SectionLength` int(10) unsigned NOT NULL default '600',
|
`SectionLength` int(10) unsigned NOT NULL default '600',
|
||||||
`MinSectionLength` int(10) unsigned NOT NULL default '10',
|
`MinSectionLength` int(10) unsigned NOT NULL default '10',
|
||||||
|
@ -522,6 +524,7 @@ CREATE TABLE `Monitors` (
|
||||||
`TrackDelay` smallint(5) unsigned,
|
`TrackDelay` smallint(5) unsigned,
|
||||||
`ReturnLocation` tinyint(3) NOT NULL default '-1',
|
`ReturnLocation` tinyint(3) NOT NULL default '-1',
|
||||||
`ReturnDelay` smallint(5) unsigned,
|
`ReturnDelay` smallint(5) unsigned,
|
||||||
|
`ModectDuringPTZ` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`DefaultRate` smallint(5) unsigned NOT NULL default '100',
|
`DefaultRate` smallint(5) unsigned NOT NULL default '100',
|
||||||
`DefaultScale` smallint(5) unsigned NOT NULL default '100',
|
`DefaultScale` smallint(5) unsigned NOT NULL default '100',
|
||||||
`DefaultCodec` enum('auto','MP4','MJPEG') NOT NULL default 'auto',
|
`DefaultCodec` enum('auto','MP4','MJPEG') NOT NULL default 'auto',
|
||||||
|
@ -533,8 +536,10 @@ CREATE TABLE `Monitors` (
|
||||||
`ZoneCount` TINYINT NOT NULL DEFAULT 0,
|
`ZoneCount` TINYINT NOT NULL DEFAULT 0,
|
||||||
`Refresh` int(10) unsigned default NULL,
|
`Refresh` int(10) unsigned default NULL,
|
||||||
`Latitude` DECIMAL(10,8),
|
`Latitude` DECIMAL(10,8),
|
||||||
`Longitude` DECIMAL(10,8),
|
`Longitude` DECIMAL(11,8),
|
||||||
`RTSPServer` BOOLEAN NOT NULL DEFAULT FALSE,
|
`RTSPServer` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
|
`RTSPStreamName` varchar(255) NOT NULL default '',
|
||||||
|
`Importance` enum('Normal','Less','Not') NOT NULL default 'Normal',
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
@ -547,6 +552,12 @@ CREATE TABLE `Monitor_Status` (
|
||||||
`CaptureFPS` DECIMAL(10,2) NOT NULL default 0,
|
`CaptureFPS` DECIMAL(10,2) NOT NULL default 0,
|
||||||
`AnalysisFPS` DECIMAL(5,2) NOT NULL default 0,
|
`AnalysisFPS` DECIMAL(5,2) NOT NULL default 0,
|
||||||
`CaptureBandwidth` INT NOT NULL default 0,
|
`CaptureBandwidth` INT NOT NULL default 0,
|
||||||
|
PRIMARY KEY (`MonitorId`)
|
||||||
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `Event_Summaries`;
|
||||||
|
CREATE TABLE `Event_Summaries` (
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
`TotalEvents` int(10) default NULL,
|
`TotalEvents` int(10) default NULL,
|
||||||
`TotalEventDiskSpace` bigint default NULL,
|
`TotalEventDiskSpace` bigint default NULL,
|
||||||
`HourEvents` int(10) default NULL,
|
`HourEvents` int(10) default NULL,
|
||||||
|
@ -561,6 +572,7 @@ CREATE TABLE `Monitor_Status` (
|
||||||
`ArchivedEventDiskSpace` bigint default NULL,
|
`ArchivedEventDiskSpace` bigint default NULL,
|
||||||
PRIMARY KEY (`MonitorId`)
|
PRIMARY KEY (`MonitorId`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `States`
|
-- Table structure for table `States`
|
||||||
-- PP - Added IsActive to track custom run states
|
-- PP - Added IsActive to track custom run states
|
||||||
|
@ -670,11 +682,13 @@ CREATE TABLE `Users` (
|
||||||
`Monitors` enum('None','View','Edit') NOT NULL default 'None',
|
`Monitors` enum('None','View','Edit') NOT NULL default 'None',
|
||||||
`Groups` enum('None','View','Edit') NOT NULL default 'None',
|
`Groups` enum('None','View','Edit') NOT NULL default 'None',
|
||||||
`Devices` enum('None','View','Edit') NOT NULL default 'None',
|
`Devices` enum('None','View','Edit') NOT NULL default 'None',
|
||||||
|
`Snapshots` enum('None','View','Edit') NOT NULL default 'None',
|
||||||
`System` enum('None','View','Edit') NOT NULL default 'None',
|
`System` enum('None','View','Edit') NOT NULL default 'None',
|
||||||
`MaxBandwidth` varchar(16),
|
`MaxBandwidth` varchar(16),
|
||||||
`MonitorIds` text,
|
`MonitorIds` text,
|
||||||
`TokenMinExpiry` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
`TokenMinExpiry` BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
||||||
`APIEnabled` tinyint(3) UNSIGNED NOT NULL default 1,
|
`APIEnabled` tinyint(3) UNSIGNED NOT NULL default 1,
|
||||||
|
`HomeView` varchar(64) NOT NULL DEFAULT '',
|
||||||
PRIMARY KEY (`Id`),
|
PRIMARY KEY (`Id`),
|
||||||
UNIQUE KEY `UC_Username` (`Username`)
|
UNIQUE KEY `UC_Username` (`Username`)
|
||||||
) ENGINE=@ZM_MYSQL_ENGINE@;
|
) ENGINE=@ZM_MYSQL_ENGINE@;
|
||||||
|
@ -777,7 +791,42 @@ insert into Storage VALUES (NULL, '@ZM_DIR_EVENTS@', 'Default', 'local', NULL, N
|
||||||
--
|
--
|
||||||
-- Create a default admin user.
|
-- Create a default admin user.
|
||||||
--
|
--
|
||||||
insert into Users VALUES (NULL,'admin','$2b$12$NHZsm6AM2f2LQVROriz79ul3D6DnmFiZC.ZK5eqbF.ZWfwH9bqUJ6','',1,'View','Edit','Edit','Edit','Edit','Edit','Edit','','',0,1);
|
INSERT INTO `Users` (
|
||||||
|
`Username`,
|
||||||
|
`Password`,
|
||||||
|
`Language`,
|
||||||
|
`Enabled`,
|
||||||
|
`Stream`,
|
||||||
|
`Events`,
|
||||||
|
`Control`,
|
||||||
|
`Monitors`,
|
||||||
|
`Groups`,
|
||||||
|
`Devices`,
|
||||||
|
`Snapshots`,
|
||||||
|
`System`,
|
||||||
|
`MaxBandwidth`,
|
||||||
|
`MonitorIds`,
|
||||||
|
`TokenMinExpiry`,
|
||||||
|
`APIEnabled`,
|
||||||
|
`HomeView`
|
||||||
|
) VALUES (
|
||||||
|
'admin',
|
||||||
|
'$2b$12$NHZsm6AM2f2LQVROriz79ul3D6DnmFiZC.ZK5eqbF.ZWfwH9bqUJ6',
|
||||||
|
'' /* Language */,
|
||||||
|
1 /* Enabled */,
|
||||||
|
'View' /* Stream */,
|
||||||
|
'Edit' /* Events */,
|
||||||
|
'Edit' /* Control */,
|
||||||
|
'Edit' /* Monitors */,
|
||||||
|
'Edit' /* Groups */,
|
||||||
|
'Edit' /* Devices */,
|
||||||
|
'Edit' /* Snapshots */,
|
||||||
|
'Edit' /* System */,
|
||||||
|
'' /* Max Bandwidth */,
|
||||||
|
'' /* MonitorIds */,
|
||||||
|
0 /* TokenMinExpiry */,
|
||||||
|
0 /* Api Endabled */,
|
||||||
|
'' /* Homeview */);
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Add a sample filter to purge the oldest 100 events when the disk is 95% full
|
-- Add a sample filter to purge the oldest 100 events when the disk is 95% full
|
||||||
|
@ -876,24 +925,24 @@ VALUES (
|
||||||
--
|
--
|
||||||
-- Add in some sample control protocol definitions
|
-- Add in some sample control protocol definitions
|
||||||
--
|
--
|
||||||
INSERT INTO Controls VALUES (NULL,'Pelco-D','Local','PelcoD',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Pelco-D','Local','PelcoD',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Pelco-P','Local','PelcoP',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Pelco-P','Local','PelcoP',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Sony VISCA','Local','Visca',1,1,0,0,1,0,0,0,1,0,16384,10,4000,1,1,6,1,1,1,0,1,0,1536,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,3,1,1,1,1,0,1,1,0,1,-15578,15578,100,10000,1,1,50,1,254,1,-7789,7789,100,5000,1,1,50,1,254,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Sony VISCA','Local','Visca',1,1,0,0,1,0,0,0,1,0,16384,10,4000,1,1,6,1,1,1,0,1,0,1536,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,3,1,1,1,1,0,1,1,0,1,-15578,15578,100,10000,1,1,50,1,254,1,-7789,7789,100,5000,1,1,50,1,254,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Axis API v2','Remote','AxisV2',0,0,0,0,1,0,0,1,0,0,9999,10,2500,0,NULL,NULL,1,1,0,1,0,0,9999,10,2500,0,NULL,NULL,1,1,0,1,0,0,9999,10,2500,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,12,1,1,1,1,1,0,1,0,1,-360,360,1,90,0,NULL,NULL,0,NULL,1,-360,360,1,90,0,NULL,NULL,0,NULL,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Axis API v2','Remote','AxisV2',0,0,0,0,1,0,0,1,0,0,9999,10,2500,0,NULL,NULL,1,1,0,1,0,0,9999,10,2500,0,NULL,NULL,1,1,0,1,0,0,9999,10,2500,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,12,1,1,1,1,1,0,1,0,1,-360,360,1,90,0,NULL,NULL,0,NULL,1,-360,360,1,90,0,NULL,NULL,0,NULL,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Panasonic IP','Remote','PanasonicIP',0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,8,1,1,1,0,1,0,0,1,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Panasonic IP','Remote','PanasonicIP',0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,8,1,1,1,0,1,0,0,1,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Neu-Fusion NCS370','Remote','Ncs370',0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,24,1,0,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Neu-Fusion NCS370','Remote','Ncs370',0,0,0,0,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,24,1,0,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'AirLink SkyIPCam 7xx','Remote','SkyIPCam7xx',0,0,1,0,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,8,1,1,1,0,1,0,1,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'AirLink SkyIPCam 7xx','Remote','SkyIPCam7xx',0,0,1,0,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,8,1,1,1,0,1,0,1,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,1,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Pelco-D','Ffmpeg','PelcoD',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Pelco-D','Ffmpeg','PelcoD',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Pelco-P','Ffmpeg','PelcoP',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Pelco-P','Ffmpeg','PelcoP',1,1,0,0,1,1,0,0,1,NULL,NULL,NULL,NULL,1,0,3,1,1,0,0,1,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,0,0,0,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,1,0,1,0,NULL,NULL,NULL,NULL,0,NULL,NULL,1,20,1,1,1,1,0,0,0,1,1,NULL,NULL,NULL,NULL,1,0,63,1,254,1,NULL,NULL,NULL,NULL,1,0,63,1,254,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Foscam FI8620','Ffmpeg','FI8620_Y2k',0,0,0,0,1,0,0,0,1,1,10,1,10,1,1,63,1,1,0,0,1,1,63,1,63,1,1,63,1,1,0,0,1,0,0,0,0,1,0,255,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,255,1,8,0,1,1,1,0,0,0,1,1,1,360,1,360,1,1,63,0,0,1,1,90,1,90,1,1,63,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8620','Ffmpeg','FI8620_Y2k',0,0,0,0,1,0,0,0,1,1,10,1,10,1,1,63,1,1,0,0,1,1,63,1,63,1,1,63,1,1,0,0,1,0,0,0,0,1,0,255,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,255,1,8,0,1,1,1,0,0,0,1,1,1,360,1,360,1,1,63,0,0,1,1,90,1,90,1,1,63,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Foscam FI8608W','Ffmpeg','FI8608W_Y2k',1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,255,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,255,1,8,0,1,1,1,0,0,0,1,1,0,0,0,0,1,1,128,0,0,1,0,0,0,0,1,1,128,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8608W','Ffmpeg','FI8608W_Y2k',1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,255,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,255,1,8,0,1,1,1,0,0,0,1,1,0,0,0,0,1,1,128,0,0,1,0,0,0,0,1,1,128,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Foscam FI8908W','Remote','FI8908W',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8908W','Remote','FI8908W',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Foscam FI9821W','Ffmpeg','FI9821W_Y2k',1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,100,1,1,0,0,1,0,100,0,100,1,0,100,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,100,0,100,1,0,100,1,16,0,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,1,0,4,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Foscam FI9821W','Ffmpeg','FI9821W_Y2k',1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,1,0,100,1,1,0,0,1,0,100,0,100,1,0,100,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,100,0,100,1,0,100,1,16,0,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,1,0,4,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Loftek Sentinel','Remote','LoftekSentinel',0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,255,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,6,1,1,0,0,0,1,10,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Loftek Sentinel','Remote','LoftekSentinel',0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,255,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,6,1,1,0,0,0,1,10,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'Toshiba IK-WB11A','Remote','Toshiba_IK_WB11A',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,0,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Toshiba IK-WB11A','Remote','Toshiba_IK_WB11A',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,10,0,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'WanscamPT','Remote','Wanscam',1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,16,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'WanscamPT','Remote','Wanscam',1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,16,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
||||||
INSERT INTO Controls VALUES (NULL,'3S Domo N5071', 'Remote', '3S', 0, 0, 1, 0,1, 0, 1, 1, 0, 0, 9999, 0, 9999, 0, 0, 0, 1, 1, 1, 1, 0, 0, 9999, 20, 9999, 0, 0, 0, 1, 1, 1, 1, 0, 0, 9999, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 1, 0, 1, 1, 0, 0, 0, 0, 1, -180, 180, 40, 100, 1, 40, 100, 0, 0, 1, -180, 180, 40, 100, 1, 40, 100, 0, 0, 0, 0);
|
INSERT INTO `Controls` VALUES (NULL,'3S Domo N5071', 'Remote', '3S', 0, 0, 1, 0,1, 0, 1, 1, 0, 0, 9999, 0, 9999, 0, 0, 0, 1, 1, 1, 1, 0, 0, 9999, 20, 9999, 0, 0, 0, 1, 1, 1, 1, 0, 0, 9999, 1, 9999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 1, 0, 1, 1, 0, 0, 0, 0, 1, -180, 180, 40, 100, 1, 40, 100, 0, 0, 1, -180, 180, 40, 100, 1, 40, 100, 0, 0, 0, 0);
|
||||||
INSERT INTO Controls VALUES (NULL,'ONVIF Camera','Ffmpeg','onvif',0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,255,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,6,1,1,0,0,0,1,10,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'ONVIF Camera','Ffmpeg','onvif',0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,255,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,6,1,1,0,0,0,1,10,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0);
|
||||||
INSERT INTO `Controls` VALUES (NULL,'Foscam 9831W','Ffmpeg','FI9831W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,0,0,0,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Foscam 9831W','Ffmpeg','FI9831W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,16,1,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,0,0,0,0,0,0,0);
|
||||||
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8918W','Ffmpeg','FI8918W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,1,0,4,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'Foscam FI8918W','Ffmpeg','FI8918W',0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,1,0,0,0,1,1,0,360,0,360,1,0,4,0,0,1,0,90,0,90,1,0,4,0,0,0,0);
|
||||||
INSERT INTO `Controls` VALUES (NULL,'SunEyes SP-P1802SWPTZ','Libvlc','SPP1802SWPTZ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,0,0,0,0,1,1,0,0,0,0,1,0,64,0,0,1,0,0,0,0,1,0,64,0,0,0,0);
|
INSERT INTO `Controls` VALUES (NULL,'SunEyes SP-P1802SWPTZ','Libvlc','SPP1802SWPTZ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,8,0,1,1,0,0,0,0,1,1,0,0,0,0,1,0,64,0,0,1,0,0,0,0,1,0,64,0,0,0,0);
|
||||||
|
@ -1031,11 +1080,11 @@ CREATE TABLE MontageLayouts (
|
||||||
PRIMARY KEY (`Id`)
|
PRIMARY KEY (`Id`)
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('Freeform', '{ "default":{"float":"left","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('Freeform', '{ "default":{"float":"left","left":"0px","right":"0px","top":"0px","bottom":"0px","width":"auto"} }' );
|
||||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('2 Wide', '{ "default":{"float":"left", "width":"49%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('2 Wide', '{ "default":{"float":"left", "width":"50%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('3 Wide', '{ "default":{"float":"left", "width":"33%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('3 Wide', '{ "default":{"float":"left", "width":"33%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('4 Wide', '{ "default":{"float":"left", "width":"24.5%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('4 Wide', '{ "default":{"float":"left", "width":"25%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('5 Wide', '{ "default":{"float":"left", "width":"19%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('5 Wide', '{ "default":{"float":"left", "width":"20%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||||
|
|
||||||
CREATE TABLE Sessions (
|
CREATE TABLE Sessions (
|
||||||
id char(32) not null,
|
id char(32) not null,
|
||||||
|
@ -1044,6 +1093,26 @@ CREATE TABLE Sessions (
|
||||||
PRIMARY KEY(id)
|
PRIMARY KEY(id)
|
||||||
) ENGINE=InnoDB;
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE Snapshots (
|
||||||
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
|
`Name` VARCHAR(64),
|
||||||
|
`Description` TEXT,
|
||||||
|
`CreatedBy` int(10),
|
||||||
|
`CreatedOn` datetime default NULL,
|
||||||
|
PRIMARY KEY(Id)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE Snapshot_Events (
|
||||||
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
|
`SnapshotId` int(10) unsigned NOT NULL,
|
||||||
|
FOREIGN KEY (`SnapshotId`) REFERENCES `Snapshots` (`Id`) ON DELETE CASCADE,
|
||||||
|
`EventId` bigint unsigned NOT NULL,
|
||||||
|
FOREIGN KEY (`EventId`) REFERENCES `Events` (`Id`) ON DELETE CASCADE,
|
||||||
|
KEY `Snapshot_Events_SnapshotId_idx` (`SnapshotId`),
|
||||||
|
PRIMARY KEY(Id)
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
|
||||||
-- We generally don't alter triggers, we drop and re-create them, so let's keep them in a separate file that we can just source in update scripts.
|
-- We generally don't alter triggers, we drop and re-create them, so let's keep them in a separate file that we can just source in update scripts.
|
||||||
source @PKGDATADIR@/db/triggers.sql
|
source @PKGDATADIR@/db/triggers.sql
|
||||||
--
|
--
|
||||||
|
|
|
@ -7,318 +7,146 @@
|
||||||
-- Add Controls definition for FI9831W
|
-- Add Controls definition for FI9831W
|
||||||
-- Add Controls definition for FI8918W
|
-- Add Controls definition for FI8918W
|
||||||
--
|
--
|
||||||
INSERT INTO Controls
|
SET @s = (SELECT IF( (SELECT COUNT(*) FROM Controls WHERE Name='ONVIF Camera') > 0,
|
||||||
SELECT * FROM (SELECT NULL as Id,
|
"SELECT 'ONVIF Camera Control already exists in Controls'",
|
||||||
'ONVIF Camera' as Name,
|
"INSERT INTO Controls (
|
||||||
'Ffmpeg' as Type,
|
Name,Type,Protocol,
|
||||||
'onvif' as Protocol,
|
CanWake,CanSleep,CanReset,
|
||||||
0 as CanWake,
|
CanZoom,CanAutoZoom, CanZoomAbs,CanZoomRel,CanZoomCon,
|
||||||
0 as CanSleep,
|
MinZoomRange, MaxZoomRange, MinZoomStep,MaxZoomStep,HasZoomSpeed,MinZoomSpeed,MaxZoomSpeed,
|
||||||
1 as CanReset,
|
CanFocus,CanAutoFocus,CanFocusAbs,CanFocusRel,CanFocusCon,
|
||||||
1 as CanZoom,
|
MinFocusRange,MaxFocusRange,MinFocusStep,MaxFocusStep,HasFocusSpeed,MinFocusSpeed,MaxFocusSpeed,
|
||||||
0 as CanAutoZoom,
|
CanIris,CanAutoIris,CanIrisAbs,CanIrisRel,CanIrisCon,
|
||||||
0 as CanZoomAbs,
|
MinIrisRange, MaxIrisRange, MinIrisStep, MaxIrisStep,HasIrisSpeed,MinIrisSpeed,MaxIrisSpeed,
|
||||||
0 as CanZoomRel,
|
CanGain,CanAutoGain, CanGainAbs,CanGainRel, CanGainCon,
|
||||||
1 as CanZoomCon,
|
MinGainRange,MaxGainRange, MinGainStep, MaxGainStep, HasGainSpeed, MinGainSpeed, MaxGainSpeed,
|
||||||
0 as MinZoomRange,
|
CanWhite, CanAutoWhite, CanWhiteAbs, CanWhiteRel, CanWhiteCon,
|
||||||
0 as MaxZoomRange,
|
MinWhiteRange, MaxWhiteRange, MinWhiteStep, MaxWhiteStep, HasWhiteSpeed,MinWhiteSpeed,MaxWhiteSpeed,
|
||||||
0 as MinZoomStep,
|
HasPresets, NumPresets, HasHomePreset, CanSetPresets,
|
||||||
0 as MaxZoomStep,
|
CanMove, CanMoveDiag, CanMoveMap, CanMoveAbs, CanMoveRel, CanMoveCon,
|
||||||
0 as HasZoomSpeed,
|
CanPan, MinPanRange, MaxPanRange, MinPanStep, MaxPanStep,
|
||||||
0 as MinZoomSpeed,
|
HasPanSpeed,MinPanSpeed,MaxPanSpeed,HasTurboPan,TurboPanSpeed,CanTilt, MinTiltRange,MaxTiltRange, MinTiltStep,MaxTiltStep,
|
||||||
0 as MaxZoomSpeed,
|
HasTiltSpeed,MinTiltSpeed,MaxTiltSpeed, HasTurboTilt,TurboTiltSpeed,
|
||||||
0 as CanFocus,
|
CanAutoScan,NumScanPaths)
|
||||||
0 as CanAutoFocus,
|
VALUES
|
||||||
0 as CanFocusAbs,
|
('ONVIF Camera', 'Ffmpeg', 'onvif',
|
||||||
0 as CanFocusRel,
|
0, /* as CanWake, */ 0, /* as CanSleep, */ 1, /* as CanReset, */
|
||||||
0 as CanFocusCon,
|
|
||||||
0 as MinFocusRange,
|
|
||||||
0 as MaxFocusRange,
|
|
||||||
0 as MinFocusStep,
|
|
||||||
0 as MaxFocusStep,
|
|
||||||
0 as HasFocusSpeed,
|
|
||||||
0 as MinFocusSpeed,
|
|
||||||
0 as MaxFocusSpeed,
|
|
||||||
1 as CanIris,
|
|
||||||
0 as CanAutoIris,
|
|
||||||
1 as CanIrisAbs,
|
|
||||||
0 as CanIrisRel,
|
|
||||||
0 as CanIrisCon,
|
|
||||||
0 as MinIrisRange,
|
|
||||||
255 as MaxIrisRange,
|
|
||||||
16 as MinIrisStep,
|
|
||||||
16 as MaxIrisStep,
|
|
||||||
0 as HasIrisSpeed,
|
|
||||||
0 as MinIrisSpeed,
|
|
||||||
0 as MaxIrisSpeed,
|
|
||||||
0 as CanGain,
|
|
||||||
0 as CanAutoGain,
|
|
||||||
0 as CanGainAbs,
|
|
||||||
0 as CanGainRel,
|
|
||||||
0 as CanGainCon,
|
|
||||||
0 as MinGainRange,
|
|
||||||
0 as MaxGainRange,
|
|
||||||
0 as MinGainStep,
|
|
||||||
0 as MaxGainStep,
|
|
||||||
0 as HasGainSpeed,
|
|
||||||
0 as MinGainSpeed,
|
|
||||||
0 as MaxGainSpeed,
|
|
||||||
1 as CanWhite,
|
|
||||||
0 as CanAutoWhite,
|
|
||||||
1 as CanWhiteAbs,
|
|
||||||
0 as CanWhiteRel,
|
|
||||||
0 as CanWhiteCon,
|
|
||||||
0 as MinWhiteRange,
|
|
||||||
6 as MaxWhiteRange,
|
|
||||||
1 as MinWhiteStep,
|
|
||||||
1 as MaxWhiteStep,
|
|
||||||
0 as HasWhiteSpeed,
|
|
||||||
0 as MinWhiteSpeed,
|
|
||||||
0 as MaxWhiteSpeed,
|
|
||||||
1 as HasPresets,
|
|
||||||
10 as NumPresets,
|
|
||||||
0 as HasHomePreset,
|
|
||||||
1 as CanSetPresets,
|
|
||||||
1 as CanMove,
|
|
||||||
1 as CanMoveDiag,
|
|
||||||
0 as CanMoveMap,
|
|
||||||
0 as CanMoveAbs,
|
|
||||||
0 as CanMoveRel,
|
|
||||||
1 as CanMoveCon,
|
|
||||||
1 as CanPan,
|
|
||||||
0 as MinPanRange,
|
|
||||||
0 as MaxPanRange,
|
|
||||||
0 as MinPanStep,
|
|
||||||
0 as MaxPanStep,
|
|
||||||
0 as HasPanSpeed,
|
|
||||||
0 as MinPanSpeed,
|
|
||||||
0 as MaxPanSpeed,
|
|
||||||
0 as HasTurboPan,
|
|
||||||
0 as TurboPanSpeed,
|
|
||||||
1 as CanTilt,
|
|
||||||
0 as MinTiltRange,
|
|
||||||
0 as MaxTiltRange,
|
|
||||||
0 as MinTiltStep,
|
|
||||||
0 as MaxTiltStep,
|
|
||||||
0 as HasTiltSpeed,
|
|
||||||
0 as MinTiltSpeed,
|
|
||||||
0 as MaxTiltSpeed,
|
|
||||||
0 as HasTurboTilt,
|
|
||||||
0 as TurboTiltSpeed,
|
|
||||||
0 as CanAutoScan,
|
|
||||||
0 as NumScanPaths) AS tmp
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT Name FROM Controls WHERE name = 'ONVIF Camera'
|
|
||||||
) LIMIT 1;
|
|
||||||
|
|
||||||
INSERT INTO Controls
|
1, /* as CanZoom, */ 0, /* as CanAutoZoom, */ 0, /* as CanZoomAbs, */ 0, /* as CanZoomRel, */ 1, /* as CanZoomCon, */
|
||||||
SELECT * FROM (SELECT NULL as Id,
|
0, /* as MinZoomRange, */ 0, /* as MaxZoomRange, */ 0, /* as MinZoomStep, */ 0, /* as MaxZoomStep, */ 0, /* as HasZoomSpeed, */ 0, /* as MinZoomSpeed, */ 0, /* as MaxZoomSpeed, */
|
||||||
'Foscam 9831W' as Name,
|
0, /* as CanFocus, */ 0, /* as CanAutoFocus, */ 0, /* as CanFocusAbs, */ 0, /* as CanFocusRel, */ 0, /* as CanFocusCon, */
|
||||||
'Ffmpeg' as Type,
|
0, /* as MinFocusRange, */ 0, /* as MaxFocusRange, */ 0, /* as MinFocusStep, */ 0, /* as MaxFocusStep, */ 0, /* as HasFocusSpeed, */ 0, /* as MinFocusSpeed, */ 0, /* as MaxFocusSpeed, */
|
||||||
'FI9831W' as Protocol,
|
1, /* as CanIris, */ 0, /* as CanAutoIris, */ 1, /* as CanIrisAbs, */ 0, /* as CanIrisRel, */ 0, /* as CanIrisCon, */
|
||||||
0 as CanWake,
|
0, /* as MinIrisRange, */ 255, /* as MaxIrisRange, */ 16, /* as MinIrisStep, */ 16, /* as MaxIrisStep, */ 0, /* as HasIrisSpeed, */ 0, /* as MinIrisSpeed, */ 0, /* as MaxIrisSpeed, */
|
||||||
0 as CanSleep,
|
0, /* as CanGain, */ 0, /* as CanAutoGain, */ 0, /* as CanGainAbs, */ 0, /* as CanGainRel, */ 0, /* as CanGainCon, */
|
||||||
1 as CanReset,
|
0, /* as MinGainRange, */ 0, /* as MaxGainRange, */ 0, /* as MinGainStep, */ 0, /* as MaxGainStep, */ 0, /* as HasGainSpeed, */ 0, /* as MinGainSpeed, */ 0, /* as MaxGainSpeed, */
|
||||||
0 as CanZoom,
|
1, /* as CanWhite, */ 0, /* as CanAutoWhite, */ 1, /* as CanWhiteAbs, */ 0, /* as CanWhiteRel, */ 0, /* as CanWhiteCon, */
|
||||||
0 as CanAutoZoom,
|
0, /* as MinWhiteRange, */ 6, /* as MaxWhiteRange, */ 1, /* as MinWhiteStep, */ 1, /* as MaxWhiteStep, */ 0, /* as HasWhiteSpeed, */ 0, /* as MinWhiteSpeed, */ 0, /* as MaxWhiteSpeed, */
|
||||||
0 as CanZoomAbs,
|
1, /* as HasPresets, */ 10, /* as NumPresets, */ 0, /* as HasHomePreset, */ 1, /* as CanSetPresets, */
|
||||||
0 as CanZoomRel,
|
1, /* as CanMove, */ 1, /* as CanMoveDiag, */ 0, /* as CanMoveMap, */ 0, /* as CanMoveAbs, */ 0, /* as CanMoveRel, */ 1, /* as CanMoveCon, */
|
||||||
0 as CanZoomCon,
|
1, /* as CanPan, */ 0, /* as MinPanRange, */ 0, /* as MaxPanRange, */ 0, /* as MinPanStep, */ 0, /* as MaxPanStep, */
|
||||||
0 as MinZoomRange,
|
0, /* as HasPanSpeed, */ 0, /* as MinPanSpeed, */ 0, /* as MaxPanSpeed, */ 0, /* as HasTurboPan, */ 0, /* as TurboPanSpeed, */
|
||||||
0 as MaxZoomRange,
|
1, /* as CanTilt, */ 0, /* as MinTiltRange, */ 0, /* as MaxTiltRange, */ 0, /* as MinTiltStep, */ 0, /* as MaxTiltStep, */
|
||||||
0 as MinZoomStep,
|
0, /* as HasTiltSpeed, */ 0, /* as MinTiltSpeed, */ 0, /* as MaxTiltSpeed, */ 0, /* as HasTurboTilt, */ 0, /* as TurboTiltSpeed, */
|
||||||
0 as MaxZoomStep,
|
0, /* as CanAutoScan, */
|
||||||
0 as HasZoomSpeed,
|
0 /* as NumScanPaths */
|
||||||
0 as MinZoomSpeed,
|
)"
|
||||||
0 as MaxZoomSpeed,
|
));
|
||||||
0 as CanFocus,
|
|
||||||
0 as CanAutoFocus,
|
|
||||||
0 as CanFocusAbs,
|
|
||||||
0 as CanFocusRel,
|
|
||||||
0 as CanFocusCon,
|
|
||||||
0 as MinFocusRange,
|
|
||||||
0 as MaxFocusRange,
|
|
||||||
0 as MinFocusStep,
|
|
||||||
0 as MaxFocusStep,
|
|
||||||
0 as HasFocusSpeed,
|
|
||||||
0 as MinFocusSpeed,
|
|
||||||
0 as MaxFocusSpeed,
|
|
||||||
0 as CanIris,
|
|
||||||
0 as CanAutoIris,
|
|
||||||
0 as CanIrisAbs,
|
|
||||||
0 as CanIrisRel,
|
|
||||||
0 as CanIrisCon,
|
|
||||||
0 as MinIrisRange,
|
|
||||||
0 as MaxIrisRange,
|
|
||||||
0 as MinIrisStep,
|
|
||||||
0 as MaxIrisStep,
|
|
||||||
0 as HasIrisSpeed,
|
|
||||||
0 as MinIrisSpeed,
|
|
||||||
0 as MaxIrisSpeed,
|
|
||||||
0 as CanGain,
|
|
||||||
0 as CanAutoGain,
|
|
||||||
0 as CanGainAbs,
|
|
||||||
0 as CanGainRel,
|
|
||||||
0 as CanGainCon,
|
|
||||||
0 as MinGainRange,
|
|
||||||
0 as MaxGainRange,
|
|
||||||
0 as MinGainStep,
|
|
||||||
0 as MaxGainStep,
|
|
||||||
0 as HasGainSpeed,
|
|
||||||
0 as MinGainSpeed,
|
|
||||||
0 as MaxGainSpeed,
|
|
||||||
0 as CanWhite,
|
|
||||||
0 as CanAutoWhite,
|
|
||||||
0 as CanWhiteAbs,
|
|
||||||
0 as CanWhiteRel,
|
|
||||||
0 as CanWhiteCon,
|
|
||||||
0 as MinWhiteRange,
|
|
||||||
0 as MaxWhiteRange,
|
|
||||||
0 as MinWhiteStep,
|
|
||||||
0 as MaxWhiteStep,
|
|
||||||
0 as HasWhiteSpeed,
|
|
||||||
0 as MinWhiteSpeed,
|
|
||||||
0 as MaxWhiteSpeed,
|
|
||||||
0 as HasPresets,
|
|
||||||
16 as NumPresets,
|
|
||||||
1 as HasHomePreset,
|
|
||||||
1 as CanSetPresets,
|
|
||||||
1 as CanMove,
|
|
||||||
1 as CanMoveDiag,
|
|
||||||
0 as CanMoveMap,
|
|
||||||
0 as CanMoveAbs,
|
|
||||||
0 as CanMoveRel,
|
|
||||||
1 as CanMoveCon,
|
|
||||||
1 as CanPan,
|
|
||||||
0 as MinPanRange,
|
|
||||||
360 as MaxPanRange,
|
|
||||||
0 as MinPanStep,
|
|
||||||
360 as MaxPanStep,
|
|
||||||
1 as HasPanSpeed,
|
|
||||||
0 as MinPanSpeed,
|
|
||||||
4 as MaxPanSpeed,
|
|
||||||
0 as HasTurboPan,
|
|
||||||
0 as TurboPanSpeed,
|
|
||||||
1 as CanTilt,
|
|
||||||
0 as MinTiltRange,
|
|
||||||
90 as MaxTiltRange,
|
|
||||||
0 as MinTiltStep,
|
|
||||||
90 as MaxTiltStep,
|
|
||||||
0 as HasTiltSpeed,
|
|
||||||
0 as MinTiltSpeed,
|
|
||||||
0 as MaxTiltSpeed,
|
|
||||||
0 as HasTurboTilt,
|
|
||||||
0 as TurboTiltSpeed,
|
|
||||||
0 as CanAutoScan,
|
|
||||||
0 as NumScanPaths) AS tmp
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT Name FROM Controls WHERE name = 'Foscam 9831W'
|
|
||||||
) LIMIT 1;
|
|
||||||
|
|
||||||
INSERT INTO Controls
|
PREPARE stmt FROM @s;
|
||||||
SELECT * FROM (SELECT NULL as Id,
|
EXECUTE stmt;
|
||||||
'Foscam FI8918W' as Name,
|
|
||||||
'Ffmpeg' as Type,
|
|
||||||
'FI8918W' as Protocol,
|
|
||||||
0 as CanWake,
|
|
||||||
0 as CanSleep,
|
|
||||||
1 as CanReset,
|
|
||||||
0 as CanZoom,
|
|
||||||
0 as CanAutoZoom,
|
|
||||||
0 as CanZoomAbs,
|
|
||||||
0 as CanZoomRel,
|
|
||||||
0 as CanZoomCon,
|
|
||||||
0 as MinZoomRange,
|
|
||||||
0 as MaxZoomRange,
|
|
||||||
0 as MinZoomStep,
|
|
||||||
0 as MaxZoomStep,
|
|
||||||
0 as HasZoomSpeed,
|
|
||||||
0 as MinZoomSpeed,
|
|
||||||
0 as MaxZoomSpeed,
|
|
||||||
0 as CanFocus,
|
|
||||||
0 as CanAutoFocus,
|
|
||||||
0 as CanFocusAbs,
|
|
||||||
0 as CanFocusRel,
|
|
||||||
0 as CanFocusCon,
|
|
||||||
0 as MinFocusRange,
|
|
||||||
0 as MaxFocusRange,
|
|
||||||
0 as MinFocusStep,
|
|
||||||
0 as MaxFocusStep,
|
|
||||||
0 as HasFocusSpeed,
|
|
||||||
0 as MinFocusSpeed,
|
|
||||||
0 as MaxFocusSpeed,
|
|
||||||
0 as CanIris,
|
|
||||||
0 as CanAutoIris,
|
|
||||||
0 as CanIrisAbs,
|
|
||||||
0 as CanIrisRel,
|
|
||||||
0 as CanIrisCon,
|
|
||||||
0 as MinIrisRange,
|
|
||||||
0 as MaxIrisRange,
|
|
||||||
0 as MinIrisStep,
|
|
||||||
0 as MaxIrisStep,
|
|
||||||
0 as HasIrisSpeed,
|
|
||||||
0 as MinIrisSpeed,
|
|
||||||
0 as MaxIrisSpeed,
|
|
||||||
0 as CanGain,
|
|
||||||
0 as CanAutoGain,
|
|
||||||
0 as CanGainAbs,
|
|
||||||
0 as CanGainRel,
|
|
||||||
0 as CanGainCon,
|
|
||||||
0 as MinGainRange,
|
|
||||||
0 as MaxGainRange,
|
|
||||||
0 as MinGainStep,
|
|
||||||
0 as MaxGainStep,
|
|
||||||
0 as HasGainSpeed,
|
|
||||||
0 as MinGainSpeed,
|
|
||||||
0 as MaxGainSpeed,
|
|
||||||
0 as CanWhite,
|
|
||||||
0 as CanAutoWhite,
|
|
||||||
0 as CanWhiteAbs,
|
|
||||||
0 as CanWhiteRel,
|
|
||||||
0 as CanWhiteCon,
|
|
||||||
0 as MinWhiteRange,
|
|
||||||
0 as MaxWhiteRange,
|
|
||||||
0 as MinWhiteStep,
|
|
||||||
0 as MaxWhiteStep,
|
|
||||||
0 as HasWhiteSpeed,
|
|
||||||
0 as MinWhiteSpeed,
|
|
||||||
0 as MaxWhiteSpeed,
|
|
||||||
0 as HasPresets,
|
|
||||||
8 as NumPresets,
|
|
||||||
0 as HasHomePreset,
|
|
||||||
1 as CanSetPresets,
|
|
||||||
1 as CanMove,
|
|
||||||
1 as CanMoveDiag,
|
|
||||||
0 as CanMoveMap,
|
|
||||||
0 as CanMoveAbs,
|
|
||||||
0 as CanMoveRel,
|
|
||||||
1 as CanMoveCon,
|
|
||||||
1 as CanPan,
|
|
||||||
0 as MinPanRange,
|
|
||||||
360 as MaxPanRange,
|
|
||||||
0 as MinPanStep,
|
|
||||||
360 as MaxPanStep,
|
|
||||||
1 as HasPanSpeed,
|
|
||||||
0 as MinPanSpeed,
|
|
||||||
4 as MaxPanSpeed,
|
|
||||||
0 as HasTurboPan,
|
|
||||||
0 as TurboPanSpeed,
|
|
||||||
1 as CanTilt,
|
|
||||||
0 as MinTiltRange,
|
|
||||||
90 as MaxTiltRange,
|
|
||||||
0 as MinTiltStep,
|
|
||||||
90 as MaxTiltStep,
|
|
||||||
0 as HasTiltSpeed,
|
|
||||||
0 as MinTiltSpeed,
|
|
||||||
0 as MaxTiltSpeed,
|
|
||||||
0 as HasTurboTilt,
|
|
||||||
0 as TurboTiltSpeed,
|
|
||||||
0 as CanAutoScan,
|
|
||||||
0 as NumScanPaths) AS tmp
|
|
||||||
WHERE NOT EXISTS (
|
|
||||||
SELECT Name FROM Controls WHERE name = 'Foscam FI8918W'
|
|
||||||
) LIMIT 1;
|
|
||||||
|
|
||||||
|
SET @s = (SELECT IF( (SELECT COUNT(*) FROM Controls WHERE Name='Foscam 9831W') > 0,
|
||||||
|
"SELECT 'Foscam 9831W Camera Control already exists in Controls'",
|
||||||
|
"INSERT INTO Controls (
|
||||||
|
Name,Type,Protocol,
|
||||||
|
CanWake,CanSleep,CanReset,
|
||||||
|
CanZoom,CanAutoZoom, CanZoomAbs,CanZoomRel,CanZoomCon,
|
||||||
|
MinZoomRange, MaxZoomRange, MinZoomStep,MaxZoomStep,HasZoomSpeed,MinZoomSpeed,MaxZoomSpeed,
|
||||||
|
CanFocus,CanAutoFocus,CanFocusAbs,CanFocusRel,CanFocusCon,MinFocusRange,MaxFocusRange,MinFocusStep,MaxFocusStep,HasFocusSpeed,MinFocusSpeed,MaxFocusSpeed,
|
||||||
|
CanIris,CanAutoIris,CanIrisAbs,CanIrisRel,CanIrisCon,MinIrisRange, MaxIrisRange, MinIrisStep, MaxIrisStep,HasIrisSpeed,MinIrisSpeed,MaxIrisSpeed,
|
||||||
|
CanGain,CanAutoGain, CanGainAbs,CanGainRel, CanGainCon,
|
||||||
|
MinGainRange,MaxGainRange, MinGainStep, MaxGainStep, HasGainSpeed, MinGainSpeed, MaxGainSpeed,
|
||||||
|
CanWhite, CanAutoWhite, CanWhiteAbs, CanWhiteRel, CanWhiteCon,
|
||||||
|
MinWhiteRange, MaxWhiteRange, MinWhiteStep, MaxWhiteStep, HasWhiteSpeed,MinWhiteSpeed,MaxWhiteSpeed,
|
||||||
|
HasPresets, NumPresets, HasHomePreset, CanSetPresets,
|
||||||
|
CanMove, CanMoveDiag, CanMoveMap, CanMoveAbs, CanMoveRel, CanMoveCon,
|
||||||
|
CanPan, MinPanRange, MaxPanRange, MinPanStep, MaxPanStep,
|
||||||
|
HasPanSpeed,MinPanSpeed,MaxPanSpeed,HasTurboPan,TurboPanSpeed,CanTilt, MinTiltRange,MaxTiltRange, MinTiltStep,MaxTiltStep,
|
||||||
|
HasTiltSpeed,MinTiltSpeed,MaxTiltSpeed, HasTurboTilt,TurboTiltSpeed,
|
||||||
|
CanAutoScan,NumScanPaths)
|
||||||
|
VALUES
|
||||||
|
('Foscam 9831W', 'Ffmpeg', 'FI9831W',
|
||||||
|
0, /* as CanWake, */ 0, /* as CanSleep, */ 1, /* as CanReset, */
|
||||||
|
0, /* as CanZoom, */ 0, /* as CanAutoZoom, */ 0, /* as CanZoomAbs, */ 0, /* as CanZoomRel, */ 0, /* as CanZoomCon, */
|
||||||
|
0, /* as MinZoomRange, */ 0, /* as MaxZoomRange, */ 0, /* as MinZoomStep, */ 0, /* as MaxZoomStep, */ 0, /* as HasZoomSpeed, */ 0, /* as MinZoomSpeed, */ 0, /* as MaxZoomSpeed, */
|
||||||
|
0, /* as CanFocus, */ 0, /* as CanAutoFocus, */ 0, /* as CanFocusAbs, */ 0, /* as CanFocusRel, */ 0, /* as CanFocusCon, */
|
||||||
|
0, /* as MinFocusRange, */ 0, /* as MaxFocusRange, */ 0, /* as MinFocusStep, */ 0, /* as MaxFocusStep, */ 0, /* as HasFocusSpeed, */ 0, /* as MinFocusSpeed, */ 0, /* as MaxFocusSpeed, */
|
||||||
|
0, /* as CanIris, */ 0, /* as CanAutoIris, */ 0, /* as CanIrisAbs, */ 0, /* as CanIrisRel, */ 0, /* as CanIrisCon, */
|
||||||
|
0, /* as MinIrisRange, */ 0, /* as MaxIrisRange, */ 0, /* as MinIrisStep, */ 0, /* as MaxIrisStep, */ 0, /* as HasIrisSpeed, */ 0, /* as MinIrisSpeed, */ 0, /* as MaxIrisSpeed, */
|
||||||
|
0, /* as CanGain, */ 0, /* as CanAutoGain, */ 0, /* as CanGainAbs, */ 0, /* as CanGainRel, */ 0, /* as CanGainCon, */
|
||||||
|
0, /* as MinGainRange, */ 0, /* as MaxGainRange, */ 0, /* as MinGainStep, */ 0, /* as MaxGainStep, */ 0, /* as HasGainSpeed, */ 0, /* as MinGainSpeed, */ 0, /* as MaxGainSpeed, */
|
||||||
|
0, /* as CanWhite, */ 0, /* as CanAutoWhite, */ 0, /* as CanWhiteAbs, */ 0, /* as CanWhiteRel, */ 0, /* as CanWhiteCon, */
|
||||||
|
0, /* as MinWhiteRange, */ 0, /* as MaxWhiteRange, */ 0, /* as MinWhiteStep, */ 0, /* as MaxWhiteStep, */ 0, /* as HasWhiteSpeed, */ 0, /* as MinWhiteSpeed, */ 0, /* as MaxWhiteSpeed, */
|
||||||
|
0, /* as HasPresets, */ 16, /* as NumPresets, */ 1, /* as HasHomePreset, */ 1, /* as CanSetPresets, */
|
||||||
|
1, /* as CanMove, */ 1, /* as CanMoveDiag, */ 0, /* as CanMoveMap, */ 0, /* as CanMoveAbs, */ 0, /* as CanMoveRel, */ 1, /* as CanMoveCon, */
|
||||||
|
1, /* as CanPan, */ 0, /* as MinPanRange, */ 360, /* as MaxPanRange, */ 0, /* as MinPanStep, */ 360, /* as MaxPanStep, */
|
||||||
|
1, /* as HasPanSpeed, */ 0, /* as MinPanSpeed, */ 4, /* as MaxPanSpeed, */ 0, /* as HasTurboPan, */ 0, /* as TurboPanSpeed, */
|
||||||
|
1, /* as CanTilt, */ 0, /* as MinTiltRange, */ 90, /* as MaxTiltRange, */ 0, /* as MinTiltStep, */ 90, /* as MaxTiltStep, */
|
||||||
|
0, /* as HasTiltSpeed, */ 0, /* as MinTiltSpeed, */ 0, /* as MaxTiltSpeed, */ 0, /* as HasTurboTilt, */ 0, /* as TurboTiltSpeed, */
|
||||||
|
0, /* as CanAutoScan, */
|
||||||
|
0 /* as NumScanPaths */
|
||||||
|
)"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF( (SELECT COUNT(*) FROM Controls WHERE Name='Foscam FI8918W') > 0,
|
||||||
|
"SELECT 'Foscam 8918W Camera Control already exists in Controls'",
|
||||||
|
"INSERT INTO Controls (
|
||||||
|
Name,Type,Protocol,
|
||||||
|
CanWake,CanSleep,CanReset,
|
||||||
|
CanZoom,CanAutoZoom, CanZoomAbs,CanZoomRel,CanZoomCon,
|
||||||
|
MinZoomRange, MaxZoomRange, MinZoomStep,MaxZoomStep,HasZoomSpeed,MinZoomSpeed,MaxZoomSpeed,
|
||||||
|
CanFocus,CanAutoFocus,CanFocusAbs,CanFocusRel,CanFocusCon,MinFocusRange,MaxFocusRange,MinFocusStep,MaxFocusStep,HasFocusSpeed,MinFocusSpeed,MaxFocusSpeed,
|
||||||
|
CanIris,CanAutoIris,CanIrisAbs,CanIrisRel,CanIrisCon,MinIrisRange, MaxIrisRange, MinIrisStep, MaxIrisStep,HasIrisSpeed,MinIrisSpeed,MaxIrisSpeed,
|
||||||
|
CanGain,CanAutoGain, CanGainAbs,CanGainRel, CanGainCon,
|
||||||
|
MinGainRange,MaxGainRange, MinGainStep, MaxGainStep, HasGainSpeed, MinGainSpeed, MaxGainSpeed,
|
||||||
|
CanWhite, CanAutoWhite, CanWhiteAbs, CanWhiteRel, CanWhiteCon,
|
||||||
|
MinWhiteRange, MaxWhiteRange, MinWhiteStep, MaxWhiteStep, HasWhiteSpeed,MinWhiteSpeed,MaxWhiteSpeed,
|
||||||
|
HasPresets, NumPresets, HasHomePreset, CanSetPresets,
|
||||||
|
CanMove, CanMoveDiag, CanMoveMap, CanMoveAbs, CanMoveRel, CanMoveCon,
|
||||||
|
CanPan, MinPanRange, MaxPanRange, MinPanStep, MaxPanStep,
|
||||||
|
HasPanSpeed,MinPanSpeed,MaxPanSpeed,HasTurboPan,TurboPanSpeed,CanTilt, MinTiltRange,MaxTiltRange, MinTiltStep,MaxTiltStep,
|
||||||
|
HasTiltSpeed,MinTiltSpeed,MaxTiltSpeed, HasTurboTilt,TurboTiltSpeed,
|
||||||
|
CanAutoScan,NumScanPaths)
|
||||||
|
VALUES
|
||||||
|
('Foscam FI8918W', 'Ffmpeg', 'FI8918W',
|
||||||
|
0, /* as CanWake, */ 0, /* as CanSleep, */ 1, /* as CanReset, */
|
||||||
|
0, /* as CanZoom, */ 0, /* as CanAutoZoom, */ 0, /* as CanZoomAbs, */ 0, /* as CanZoomRel, */ 0, /* as CanZoomCon, */
|
||||||
|
0, /* as MinZoomRange, */ 0, /* as MaxZoomRange, */ 0, /* as MinZoomStep, */ 0, /* as MaxZoomStep, */ 0, /* as HasZoomSpeed, */ 0, /* as MinZoomSpeed, */ 0, /* as MaxZoomSpeed, */
|
||||||
|
0, /* as CanFocus, */ 0, /* as CanAutoFocus, */ 0, /* as CanFocusAbs, */ 0, /* as CanFocusRel, */ 0, /* as CanFocusCon, */
|
||||||
|
0, /* as MinFocusRange, */ 0, /* as MaxFocusRange, */ 0, /* as MinFocusStep, */ 0, /* as MaxFocusStep, */ 0, /* as HasFocusSpeed, */ 0, /* as MinFocusSpeed, */ 0, /* as MaxFocusSpeed, */
|
||||||
|
0, /* as CanIris, */ 0, /* as CanAutoIris, */ 0, /* as CanIrisAbs, */ 0, /* as CanIrisRel, */ 0, /* as CanIrisCon, */
|
||||||
|
0, /* as MinIrisRange, */ 0, /* as MaxIrisRange, */ 0, /* as MinIrisStep, */ 0, /* as MaxIrisStep, */ 0, /* as HasIrisSpeed, */ 0, /* as MinIrisSpeed, */ 0, /* as MaxIrisSpeed, */
|
||||||
|
0, /* as CanGain, */ 0, /* as CanAutoGain, */ 0, /* as CanGainAbs, */ 0, /* as CanGainRel, */ 0, /* as CanGainCon, */
|
||||||
|
0, /* as MinGainRange, */ 0, /* as MaxGainRange, */ 0, /* as MinGainStep, */ 0, /* as MaxGainStep, */ 0, /* as HasGainSpeed, */ 0, /* as MinGainSpeed, */ 0, /* as MaxGainSpeed, */
|
||||||
|
0, /* as CanWhite, */ 0, /* as CanAutoWhite, */ 0, /* as CanWhiteAbs, */ 0, /* as CanWhiteRel, */ 0, /* as CanWhiteCon, */
|
||||||
|
0, /* as MinWhiteRange, */ 0, /* as MaxWhiteRange, */ 0, /* as MinWhiteStep, */ 0, /* as MaxWhiteStep, */ 0, /* as HasWhiteSpeed, */ 0, /* as MinWhiteSpeed, */ 0, /* as MaxWhiteSpeed, */
|
||||||
|
0, /* as HasPresets, */ 8, /* as NumPresets, */ 0, /* as HasHomePreset, */ 1, /* as CanSetPresets, */
|
||||||
|
1, /* as CanMove, */ 1, /* as CanMoveDiag, */ 0, /* as CanMoveMap, */ 0, /* as CanMoveAbs, */ 0, /* as CanMoveRel, */ 1, /* as CanMoveCon, */
|
||||||
|
1, /* as CanPan, */ 0, /* as MinPanRange, */ 360, /* as MaxPanRange, */ 0, /* as MinPanStep, */ 360, /* as MaxPanStep, */
|
||||||
|
1, /* as HasPanSpeed, */ 0, /* as MinPanSpeed, */ 4, /* as MaxPanSpeed, */ 0, /* as HasTurboPan, */ 0, /* as TurboPanSpeed, */
|
||||||
|
1, /* as CanTilt, */ 0, /* as MinTiltRange, */ 90, /* as MaxTiltRange, */ 0, /* as MinTiltStep, */ 90, /* as MaxTiltStep, */
|
||||||
|
0, /* as HasTiltSpeed, */ 0, /* as MinTiltSpeed, */ 0, /* as MaxTiltSpeed, */ 0, /* as HasTurboTilt, */ 0, /* as TurboTiltSpeed, */
|
||||||
|
0, /* as CanAutoScan, */
|
||||||
|
0 /* as NumScanPaths */
|
||||||
|
)"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
--
|
--
|
||||||
-- Hide USE_DEEP_STORAGE from user to prevent accidental event loss
|
-- Hide USE_DEEP_STORAGE from user to prevent accidental event loss
|
||||||
--
|
--
|
||||||
|
|
|
@ -28,8 +28,8 @@ SET @s = (SELECT IF(
|
||||||
AND table_name = 'Monitors'
|
AND table_name = 'Monitors'
|
||||||
AND column_name = 'TotalEvents'
|
AND column_name = 'TotalEvents'
|
||||||
) > 0,
|
) > 0,
|
||||||
"SELECT 'Column TotalEvents is already removed from Monitors'",
|
"ALTER TABLE `Monitors` DROP `TotalEvents`",
|
||||||
"ALTER TABLE `Monitors` DROP `TotalEvents`"
|
"SELECT 'Column TotalEvents is already removed from Monitors'"
|
||||||
));
|
));
|
||||||
PREPARE stmt FROM @s;
|
PREPARE stmt FROM @s;
|
||||||
EXECUTE stmt;
|
EXECUTE stmt;
|
||||||
|
@ -50,8 +50,8 @@ SET @s = (SELECT IF(
|
||||||
AND table_name = 'Monitors'
|
AND table_name = 'Monitors'
|
||||||
AND column_name = 'TotalEventDiskSpace'
|
AND column_name = 'TotalEventDiskSpace'
|
||||||
) > 0,
|
) > 0,
|
||||||
"SELECT 'Column TotalEventDiskSpace is already removed from Monitors'",
|
"ALTER TABLE `Monitors` DROP `TotalEventDiskSpace`",
|
||||||
"ALTER TABLE `Monitors` DROP `TotalEventDiskSpace`"
|
"SELECT 'Column TotalEventDiskSpace is already removed from Monitors'"
|
||||||
));
|
));
|
||||||
PREPARE stmt FROM @s;
|
PREPARE stmt FROM @s;
|
||||||
EXECUTE stmt;
|
EXECUTE stmt;
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitors'
|
||||||
|
AND column_name = 'RTSPStreamName'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column RTSPStreamName already exists in Monitors'",
|
||||||
|
"ALTER TABLE `Monitors` ADD `RTSPStreamName` varchar(255) NOT NULL default '' AFTER `RTSPServer`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
|
@ -0,0 +1,15 @@
|
||||||
|
--
|
||||||
|
-- Add SecondPath to Monitors
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitors'
|
||||||
|
AND column_name = 'SecondPath'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column SecondPath already exists in Monitors'",
|
||||||
|
"ALTER TABLE `Monitors` ADD `SecondPath` VARCHAR(255) AFTER `Path`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
|
@ -0,0 +1,56 @@
|
||||||
|
--
|
||||||
|
-- Add HomeView to Users
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Users'
|
||||||
|
AND column_name = 'HomeView'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column HomeView already exists in Users'",
|
||||||
|
"ALTER TABLE `Users` ADD `HomeView` varchar(64) NOT NULL DEFAULT '' AFTER `APIEnabled`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Snapshots'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Snapshots table exists'",
|
||||||
|
"CREATE TABLE Snapshots (
|
||||||
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
|
`Name` VARCHAR(64),
|
||||||
|
`Description` TEXT,
|
||||||
|
`CreatedBy` int(10),
|
||||||
|
`CreatedOn` datetime default NULL,
|
||||||
|
PRIMARY KEY(Id)
|
||||||
|
) ENGINE=InnoDB;"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE table_name = 'Snapshot_Events'
|
||||||
|
AND table_schema = DATABASE()
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Snapshot_Events table exists'",
|
||||||
|
"CREATE TABLE Snapshot_Events (
|
||||||
|
`Id` int(10) unsigned NOT NULL auto_increment,
|
||||||
|
`SnapshotId` int(10) unsigned NOT NULL,
|
||||||
|
FOREIGN KEY (`SnapshotId`) REFERENCES `Snapshots` (`Id`) ON DELETE CASCADE,
|
||||||
|
`EventId` bigint unsigned NOT NULL,
|
||||||
|
FOREIGN KEY (`EventId`) REFERENCES `Events` (`Id`) ON DELETE CASCADE,
|
||||||
|
KEY `Snapshot_Events_SnapshotId_idx` (`SnapshotId`),
|
||||||
|
PRIMARY KEY(Id)
|
||||||
|
) ENGINE=InnoDB;"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
|
@ -0,0 +1,19 @@
|
||||||
|
--
|
||||||
|
-- Add MaxImageBufferCount, set it to ImageBufferCount if that was large and set ImageBufferCount to 3
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitors'
|
||||||
|
AND column_name = 'MaxImageBufferCount'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column MaxImageBufferCount already exists in Monitors'",
|
||||||
|
"ALTER TABLE `Monitors` ADD `MaxImageBufferCount` smallint(5) unsigned NOT NULL default '0' AFTER `ImageBufferCount`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
UPDATE `Monitors` SET MaxImageBufferCount=ImageBufferCount WHERE ImageBufferCount >= 20;
|
||||||
|
UPDATE `Monitors` SET ImageBufferCount = 3;
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
|
||||||
|
UPDATE `Controls` SET `Protocol`='FoscamCGI' where `Protocol`='onvif';
|
|
@ -0,0 +1,69 @@
|
||||||
|
SELECT 'This update may make changes that require SUPER privileges. If you see an error message saying:
|
||||||
|
|
||||||
|
ERROR 1419 (HY000) at line 298: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
|
||||||
|
|
||||||
|
You will have to either run this update as root manually using something like (on ubuntu/debian)
|
||||||
|
|
||||||
|
sudo mysql --defaults-file=/etc/mysql/debian.cnf zm < /usr/share/zoneminder/db/zm_update-1.35.24.sql
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
sudo mysql --defaults-file=/etc/mysql/debian.cnf "set global log_bin_trust_function_creators=1;"
|
||||||
|
sudo zmupdate.pl
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
Turn off binary logging in your mysql server by adding this to your mysql config.
|
||||||
|
[mysqld]
|
||||||
|
skip-log-bin
|
||||||
|
|
||||||
|
';
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Event_Summaries'
|
||||||
|
) > 0
|
||||||
|
,
|
||||||
|
"SELECT 'Event_Summaries Already exists'",
|
||||||
|
"
|
||||||
|
CREATE TABLE `Event_Summaries` (
|
||||||
|
`MonitorId` int(10) unsigned NOT NULL,
|
||||||
|
`TotalEvents` int(10) default NULL,
|
||||||
|
`TotalEventDiskSpace` bigint default NULL,
|
||||||
|
`HourEvents` int(10) default NULL,
|
||||||
|
`HourEventDiskSpace` bigint default NULL,
|
||||||
|
`DayEvents` int(10) default NULL,
|
||||||
|
`DayEventDiskSpace` bigint default NULL,
|
||||||
|
`WeekEvents` int(10) default NULL,
|
||||||
|
`WeekEventDiskSpace` bigint default NULL,
|
||||||
|
`MonthEvents` int(10) default NULL,
|
||||||
|
`MonthEventDiskSpace` bigint default NULL,
|
||||||
|
`ArchivedEvents` int(10) default NULL,
|
||||||
|
`ArchivedEventDiskSpace` bigint default NULL,
|
||||||
|
PRIMARY KEY (`MonitorId`)
|
||||||
|
) ENGINE=InnoDb;
|
||||||
|
"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
DELETE FROM Event_Summaries;
|
||||||
|
|
||||||
|
REPLACE INTO Event_Summaries
|
||||||
|
SELECT MonitorId,
|
||||||
|
COUNT(Id) AS TotalEvents,
|
||||||
|
SUM(DiskSpace) AS TotalEventDiskSpace,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 hour),1,0)) AS HourEvents,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 hour),DiskSpace,0)) AS HourEventDiskSpace,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 day),1,0)) AS DayEvents,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 day),DiskSpace,0)) AS DayEventDiskSpace,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 week),1,0)) AS WeekEvents,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 week),DiskSpace,0)) AS WeekEventDiskSpace,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 month),1,0)) AS MonthEvents,
|
||||||
|
SUM(IF(StartDateTime > DATE_SUB(NOW(), INTERVAL 1 month),DiskSpace,0)) AS MonthEventDiskSpace,
|
||||||
|
SUM(IF(Archived,1,0)) AS ArchivedEvents,
|
||||||
|
SUM(IF(Archived,DiskSpace,0)) AS ArchivedEventDiskSpace
|
||||||
|
FROM Events GROUP BY MonitorId;
|
||||||
|
|
||||||
|
source @PKGDATADIR@/db/triggers.sql
|
|
@ -0,0 +1,144 @@
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'TotalEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `TotalEvents`",
|
||||||
|
"SELECT 'Column TotalEvents already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'TotalEventDiskSpace'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `TotalEventDiskSpace`",
|
||||||
|
"SELECT 'Column TotalEventDiskSpace already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'HourEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `HourEvents`",
|
||||||
|
"SELECT 'Column HourEvents already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'HourEventDiskSpace'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `HourEventDiskSpace`",
|
||||||
|
"SELECT 'Column HourEventDiskSpace already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'DayEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `DayEvents`",
|
||||||
|
"SELECT 'Column DayEvents already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'DayEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `DayEventDiskSpace`",
|
||||||
|
"SELECT 'Column DayEventDiskSpace already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'WeekEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `WeekEvents`",
|
||||||
|
"SELECT 'Column WeekEvents already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'WeekEventDiskSpace'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `WeekEventDiskSpace`",
|
||||||
|
"SELECT 'Column WeekEventDiskSpace already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'MonthEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `MonthEvents`",
|
||||||
|
"SELECT 'Column MonthEvents already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'MonthEventDiskSpace'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `MonthEventDiskSpace`",
|
||||||
|
"SELECT 'Column MonthEventDiskSpace already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'ArchivedEvents'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `ArchivedEvents`",
|
||||||
|
"SELECT 'Column ArchivedEvents already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitor_Status'
|
||||||
|
AND column_name = 'ArchivedEventDiskSpace'
|
||||||
|
) > 0,
|
||||||
|
"ALTER TABLE `Monitor_Status` DROP `ArchivedEventDiskSpace`",
|
||||||
|
"SELECT 'Column ArchivedEventDiskSpace already removed from Monitor_Status'"
|
||||||
|
));
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitors'
|
||||||
|
AND column_name = 'Importance'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column Importance already exists in Monitors'",
|
||||||
|
"ALTER TABLE `Monitors` ADD `Importance` enum('Not','Less','Normal') AFTER `RTSPStreamName`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
--
|
||||||
|
-- Add Snapshot permission to Users
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Users'
|
||||||
|
AND column_name = 'Snapshots'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column Snapshots already exists in Users'",
|
||||||
|
"ALTER TABLE `Users` ADD `Snapshots` enum('None','View','Edit') NOT NULL default 'None' AFTER `Devices`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
||||||
|
|
||||||
|
UPDATE `Users` SET `Snapshots` = `Events`;
|
|
@ -0,0 +1,15 @@
|
||||||
|
--
|
||||||
|
-- Add ModectDuringPTZ
|
||||||
|
--
|
||||||
|
|
||||||
|
SET @s = (SELECT IF(
|
||||||
|
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = DATABASE()
|
||||||
|
AND table_name = 'Monitors'
|
||||||
|
AND column_name = 'ModectDuringPTZ'
|
||||||
|
) > 0,
|
||||||
|
"SELECT 'Column ModectDuringPTZ already exists in Monitors'",
|
||||||
|
"ALTER TABLE `Monitors` ADD `ModectDuringPTZ` tinyint(3) unsigned NOT NULL default '0' AFTER `ReturnDelay`"
|
||||||
|
));
|
||||||
|
|
||||||
|
PREPARE stmt FROM @s;
|
||||||
|
EXECUTE stmt;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `Monitors` MODIFY `Encoder` varchar(32);
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `Monitors` MODIFY `Longitude` DECIMAL(11,8);
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `Monitors` MODIFY `Longitude` DECIMAL(11,8);
|
|
@ -0,0 +1,7 @@
|
||||||
|
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left","left":"0px","right":"0px","top":"0px","bottom":"0px","width":"auto"} }' WHERE `Name`='Freeform';
|
||||||
|
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left", "width":"49%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' WHERE `Name`='2 Wide';
|
||||||
|
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left", "width":"25%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' WHERE `Name`='4 Wide';
|
||||||
|
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left", "width":"20%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' WHERE `Name`='5 Wide';
|
||||||
|
|
||||||
|
UPDATE Monitors set Importance = 'Normal' where Importance IS NULL;
|
||||||
|
ALTER TABLE `Monitors` MODIFY `Importance` enum('Normal','Less','Not') NOT NULL default 'Normal';
|
|
@ -1,2 +1,4 @@
|
||||||
add_subdirectory(jwt-cpp)
|
add_subdirectory(jwt-cpp)
|
||||||
add_subdirectory(libbcrypt)
|
add_subdirectory(libbcrypt)
|
||||||
|
add_subdirectory(RtspServer)
|
||||||
|
add_subdirectory(span-lite)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit cd7fd49becad6010a1b8466bfebbd93999a39878
|
|
@ -1,30 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include "include/jwt-cpp/base.h"
|
|
||||||
|
|
||||||
TEST(BaseTest, Base64Decode) {
|
|
||||||
ASSERT_EQ("1", jwt::base::decode<jwt::alphabet::base64>("MQ=="));
|
|
||||||
ASSERT_EQ("12", jwt::base::decode<jwt::alphabet::base64>("MTI="));
|
|
||||||
ASSERT_EQ("123", jwt::base::decode<jwt::alphabet::base64>("MTIz"));
|
|
||||||
ASSERT_EQ("1234", jwt::base::decode<jwt::alphabet::base64>("MTIzNA=="));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(BaseTest, Base64DecodeURL) {
|
|
||||||
ASSERT_EQ("1", jwt::base::decode<jwt::alphabet::base64url>("MQ%3d%3d"));
|
|
||||||
ASSERT_EQ("12", jwt::base::decode<jwt::alphabet::base64url>("MTI%3d"));
|
|
||||||
ASSERT_EQ("123", jwt::base::decode<jwt::alphabet::base64url>("MTIz"));
|
|
||||||
ASSERT_EQ("1234", jwt::base::decode<jwt::alphabet::base64url>("MTIzNA%3d%3d"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(BaseTest, Base64Encode) {
|
|
||||||
ASSERT_EQ("MQ==", jwt::base::encode<jwt::alphabet::base64>("1"));
|
|
||||||
ASSERT_EQ("MTI=", jwt::base::encode<jwt::alphabet::base64>("12"));
|
|
||||||
ASSERT_EQ("MTIz", jwt::base::encode<jwt::alphabet::base64>("123"));
|
|
||||||
ASSERT_EQ("MTIzNA==", jwt::base::encode<jwt::alphabet::base64>("1234"));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(BaseTest, Base64EncodeURL) {
|
|
||||||
ASSERT_EQ("MQ%3d%3d", jwt::base::encode<jwt::alphabet::base64url>("1"));
|
|
||||||
ASSERT_EQ("MTI%3d", jwt::base::encode<jwt::alphabet::base64url>("12"));
|
|
||||||
ASSERT_EQ("MTIz", jwt::base::encode<jwt::alphabet::base64url>("123"));
|
|
||||||
ASSERT_EQ("MTIzNA%3d%3d", jwt::base::encode<jwt::alphabet::base64url>("1234"));
|
|
||||||
}
|
|
|
@ -3,4 +3,4 @@ add_library(jwt-cpp::jwt-cpp ALIAS jwt-cpp)
|
||||||
|
|
||||||
target_include_directories(jwt-cpp
|
target_include_directories(jwt-cpp
|
||||||
INTERFACE
|
INTERFACE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/include/jwt-cpp)
|
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
||||||
|
|
|
@ -1,33 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include "include/jwt-cpp/jwt.h"
|
|
||||||
|
|
||||||
TEST(ClaimTest, AudienceAsString) {
|
|
||||||
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZXN0In0.WZnM3SIiSRHsbO3O7Z2bmIzTJ4EC32HRBKfLznHhrh4";
|
|
||||||
auto decoded = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_TRUE(decoded.has_algorithm());
|
|
||||||
ASSERT_TRUE(decoded.has_type());
|
|
||||||
ASSERT_FALSE(decoded.has_content_type());
|
|
||||||
ASSERT_FALSE(decoded.has_key_id());
|
|
||||||
ASSERT_FALSE(decoded.has_issuer());
|
|
||||||
ASSERT_FALSE(decoded.has_subject());
|
|
||||||
ASSERT_TRUE(decoded.has_audience());
|
|
||||||
ASSERT_FALSE(decoded.has_expires_at());
|
|
||||||
ASSERT_FALSE(decoded.has_not_before());
|
|
||||||
ASSERT_FALSE(decoded.has_issued_at());
|
|
||||||
ASSERT_FALSE(decoded.has_id());
|
|
||||||
|
|
||||||
ASSERT_EQ("HS256", decoded.get_algorithm());
|
|
||||||
ASSERT_EQ("JWT", decoded.get_type());
|
|
||||||
auto aud = decoded.get_audience();
|
|
||||||
ASSERT_EQ(1, aud.size());
|
|
||||||
ASSERT_EQ("test", *aud.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(ClaimTest, SetAudienceAsString) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_type("JWT")
|
|
||||||
.set_audience("test")
|
|
||||||
.sign(jwt::algorithm::hs256("test"));
|
|
||||||
ASSERT_EQ("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ0ZXN0In0.ny5Fa0vzAg7tNL95KWg_ecBNd3XP3tdAzq0SFA6diY4", token);
|
|
||||||
}
|
|
|
@ -38,7 +38,7 @@ PROJECT_NAME = "JWT-C++"
|
||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER =
|
PROJECT_NUMBER = 0.5.0
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
|
@ -889,7 +889,7 @@ EXCLUDE_SYMLINKS = NO
|
||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# Note that the wildcards are matched against the file with absolute path, so to
|
||||||
# exclude all test directories for example use the pattern */test/*
|
# exclude all test directories for example use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_PATTERNS =
|
EXCLUDE_PATTERNS = *nlohmann*, *picojson*
|
||||||
|
|
||||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||||
|
@ -900,13 +900,13 @@ EXCLUDE_PATTERNS =
|
||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# Note that the wildcards are matched against the file with absolute path, so to
|
||||||
# exclude all test directories use the pattern */test/*
|
# exclude all test directories use the pattern */test/*
|
||||||
|
|
||||||
EXCLUDE_SYMBOLS =
|
EXCLUDE_SYMBOLS = jwt::details
|
||||||
|
|
||||||
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
|
# The EXAMPLE_PATH tag can be used to specify one or more files or directories
|
||||||
# that contain example code fragments that are included (see the \include
|
# that contain example code fragments that are included (see the \include
|
||||||
# command).
|
# command).
|
||||||
|
|
||||||
EXAMPLE_PATH =
|
EXAMPLE_PATH = example
|
||||||
|
|
||||||
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
|
||||||
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
|
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
|
||||||
|
@ -1666,7 +1666,7 @@ EXTRA_SEARCH_MAPPINGS =
|
||||||
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
|
# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
|
||||||
# The default value is: YES.
|
# The default value is: YES.
|
||||||
|
|
||||||
GENERATE_LATEX = YES
|
GENERATE_LATEX = NO
|
||||||
|
|
||||||
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
|
# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
|
||||||
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
|
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include "include/jwt-cpp/jwt.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
extern std::string google_cert;
|
|
||||||
extern std::string google_cert_key;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(HelperTest, Cert2Pubkey) {
|
|
||||||
auto key = jwt::helper::extract_pubkey_from_cert(google_cert);
|
|
||||||
ASSERT_EQ(google_cert_key, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
std::string google_cert = R"(-----BEGIN CERTIFICATE-----
|
|
||||||
MIIF8DCCBVmgAwIBAgIKYFOB9QABAACIvTANBgkqhkiG9w0BAQUFADBGMQswCQYD
|
|
||||||
VQQGEwJVUzETMBEGA1UEChMKR29vZ2xlIEluYzEiMCAGA1UEAxMZR29vZ2xlIElu
|
|
||||||
dGVybmV0IEF1dGhvcml0eTAeFw0xMzA1MjIxNTQ5MDRaFw0xMzEwMzEyMzU5NTla
|
|
||||||
MGYxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1N
|
|
||||||
b3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUgSW5jMRUwEwYDVQQDFAwqLmdv
|
|
||||||
b2dsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARmSpIUbCqhUBq1UwnR
|
|
||||||
Ai7/TNSk6W8JmasR+I0r/NLDYv5yApbAz8HXXN8hDdurMRP6Jy1Q0UIKmyls8HPH
|
|
||||||
exoCo4IECjCCBAYwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAsGA1Ud
|
|
||||||
DwQEAwIHgDAdBgNVHQ4EFgQUU3jT0NVNRgU5ZinRHGrlyoGEnoYwHwYDVR0jBBgw
|
|
||||||
FoAUv8Aw6/VDET5nup6R+/xq2uNrEiQwWwYDVR0fBFQwUjBQoE6gTIZKaHR0cDov
|
|
||||||
L3d3dy5nc3RhdGljLmNvbS9Hb29nbGVJbnRlcm5ldEF1dGhvcml0eS9Hb29nbGVJ
|
|
||||||
bnRlcm5ldEF1dGhvcml0eS5jcmwwZgYIKwYBBQUHAQEEWjBYMFYGCCsGAQUFBzAC
|
|
||||||
hkpodHRwOi8vd3d3LmdzdGF0aWMuY29tL0dvb2dsZUludGVybmV0QXV0aG9yaXR5
|
|
||||||
L0dvb2dsZUludGVybmV0QXV0aG9yaXR5LmNydDAMBgNVHRMBAf8EAjAAMIICwwYD
|
|
||||||
VR0RBIICujCCAraCDCouZ29vZ2xlLmNvbYINKi5hbmRyb2lkLmNvbYIWKi5hcHBl
|
|
||||||
bmdpbmUuZ29vZ2xlLmNvbYISKi5jbG91ZC5nb29nbGUuY29tghYqLmdvb2dsZS1h
|
|
||||||
bmFseXRpY3MuY29tggsqLmdvb2dsZS5jYYILKi5nb29nbGUuY2yCDiouZ29vZ2xl
|
|
||||||
LmNvLmlugg4qLmdvb2dsZS5jby5qcIIOKi5nb29nbGUuY28udWuCDyouZ29vZ2xl
|
|
||||||
LmNvbS5hcoIPKi5nb29nbGUuY29tLmF1gg8qLmdvb2dsZS5jb20uYnKCDyouZ29v
|
|
||||||
Z2xlLmNvbS5jb4IPKi5nb29nbGUuY29tLm14gg8qLmdvb2dsZS5jb20udHKCDyou
|
|
||||||
Z29vZ2xlLmNvbS52boILKi5nb29nbGUuZGWCCyouZ29vZ2xlLmVzggsqLmdvb2ds
|
|
||||||
ZS5mcoILKi5nb29nbGUuaHWCCyouZ29vZ2xlLml0ggsqLmdvb2dsZS5ubIILKi5n
|
|
||||||
b29nbGUucGyCCyouZ29vZ2xlLnB0gg8qLmdvb2dsZWFwaXMuY26CFCouZ29vZ2xl
|
|
||||||
Y29tbWVyY2UuY29tgg0qLmdzdGF0aWMuY29tggwqLnVyY2hpbi5jb22CECoudXJs
|
|
||||||
Lmdvb2dsZS5jb22CFioueW91dHViZS1ub2Nvb2tpZS5jb22CDSoueW91dHViZS5j
|
|
||||||
b22CFioueW91dHViZWVkdWNhdGlvbi5jb22CCyoueXRpbWcuY29tggthbmRyb2lk
|
|
||||||
LmNvbYIEZy5jb4IGZ29vLmdsghRnb29nbGUtYW5hbHl0aWNzLmNvbYIKZ29vZ2xl
|
|
||||||
LmNvbYISZ29vZ2xlY29tbWVyY2UuY29tggp1cmNoaW4uY29tggh5b3V0dS5iZYIL
|
|
||||||
eW91dHViZS5jb22CFHlvdXR1YmVlZHVjYXRpb24uY29tMA0GCSqGSIb3DQEBBQUA
|
|
||||||
A4GBAAMn0K3j3yhC+X+uyh6eABa2Eq7xiY5/mUB886Ir19vxluSMNKD6n/iY8vHj
|
|
||||||
trn0BhuW8/vmJyudFkIcEDUYE4ivQMlsfIL7SOGw6OevVLmm02aiRHWj5T20Ds+S
|
|
||||||
OpueYUG3NBcHP/5IzhUYIQJbGzlQaUaZBMaQeC8ZslMNLWI2
|
|
||||||
-----END CERTIFICATE-----)";
|
|
||||||
|
|
||||||
std::string google_cert_key = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEZkqSFGwqoVAatVMJ0QIu/0zUpOlv
|
|
||||||
CZmrEfiNK/zSw2L+cgKWwM/B11zfIQ3bqzET+ictUNFCCpspbPBzx3saAg==
|
|
||||||
-----END PUBLIC KEY-----
|
|
||||||
)";
|
|
||||||
}
|
|
|
@ -1,98 +1,208 @@
|
||||||
# jwt-cpp
|
# ![logo](https://raw.githubusercontent.com/Thalhammer/jwt-cpp/master/.github/logo.svg)
|
||||||
|
|
||||||
|
[![License Badge](https://img.shields.io/github/license/Thalhammer/jwt-cpp)](https://github.com/Thalhammer/jwt-cpp/blob/master/LICENSE)
|
||||||
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/5f7055e294744901991fd0a1620b231d)](https://app.codacy.com/app/Thalhammer/jwt-cpp?utm_source=github.com&utm_medium=referral&utm_content=Thalhammer/jwt-cpp&utm_campaign=Badge_Grade_Settings)
|
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/5f7055e294744901991fd0a1620b231d)](https://app.codacy.com/app/Thalhammer/jwt-cpp?utm_source=github.com&utm_medium=referral&utm_content=Thalhammer/jwt-cpp&utm_campaign=Badge_Grade_Settings)
|
||||||
|
[![Linux Badge][Linux]][Cross-Platform]
|
||||||
|
[![MacOS Badge][MacOS]][Cross-Platform]
|
||||||
|
[![Windows Badge][Windows]][Cross-Platform]
|
||||||
|
[![Coverage Status](https://coveralls.io/repos/github/Thalhammer/jwt-cpp/badge.svg?branch=master)](https://coveralls.io/github/Thalhammer/jwt-cpp?branch=master)
|
||||||
|
[![Documentation Badge](https://img.shields.io/badge/Documentation-master-blue)](https://thalhammer.github.io/jwt-cpp/)
|
||||||
|
[![GitHub release (latest SemVer including pre-releases)](https://img.shields.io/github/v/release/Thalhammer/jwt-cpp?include_prereleases)](https://github.com/Thalhammer/jwt-cpp/releases)
|
||||||
|
[![Stars Badge](https://img.shields.io/github/stars/Thalhammer/jwt-cpp)](https://github.com/Thalhammer/jwt-cpp/stargazers)
|
||||||
|
|
||||||
A header only library for creating and validating json web tokens in c++.
|
[Linux]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Thalhammer/jwt-cpp/badges/cross-platform/ubuntu-latest/shields.json
|
||||||
|
[MacOS]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Thalhammer/jwt-cpp/badges/cross-platform/macos-latest/shields.json
|
||||||
|
[Windows]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Thalhammer/jwt-cpp/badges/cross-platform/windows-latest/shields.json
|
||||||
|
[Cross-Platform]: https://github.com/Thalhammer/jwt-cpp/actions?query=workflow%3A%22Cross-Platform+CI%22
|
||||||
|
|
||||||
|
A header only library for creating and validating [JSON Web Tokens](https://tools.ietf.org/html/rfc7519) in C++11. For a great introduction, [read this](https://jwt.io/introduction/).
|
||||||
|
|
||||||
## Signature algorithms
|
## Signature algorithms
|
||||||
As of version 0.2.0 jwt-cpp supports all algorithms defined by the spec. The modular design of jwt-cpp allows one to add additional algorithms without any problems. If you need any feel free to open a pull request.
|
|
||||||
For the sake of completeness, here is a list of all supported algorithms:
|
|
||||||
* HS256
|
|
||||||
* HS384
|
|
||||||
* HS512
|
|
||||||
* RS256
|
|
||||||
* RS384
|
|
||||||
* RS512
|
|
||||||
* ES256
|
|
||||||
* ES384
|
|
||||||
* ES512
|
|
||||||
* PS256
|
|
||||||
* PS384
|
|
||||||
* PS512
|
|
||||||
|
|
||||||
## Examples
|
jwt-cpp supports all the algorithms defined by the specifications. The modular design allows to easily add additional algorithms without any problems. If you need any feel free to create a pull request or [open an issue](https://github.com/Thalhammer/jwt-cpp/issues/new).
|
||||||
Simple example of decoding a token and printing all claims:
|
|
||||||
```c++
|
For completeness, here is a list of all supported algorithms:
|
||||||
|
|
||||||
|
| HMSC | RSA | ECDSA | PSS | EdDSA |
|
||||||
|
| ----- | ----- | ----- | ----- | ------- |
|
||||||
|
| HS256 | RS256 | ES256 | PS256 | Ed25519 |
|
||||||
|
| HS384 | RS384 | ES384 | PS384 | Ed448 |
|
||||||
|
| HS512 | RS512 | ES512 | PS512 | |
|
||||||
|
|
||||||
|
## SSL Compatibility
|
||||||
|
|
||||||
|
In the name of flexibility and extensibility, jwt-cpp supports both [OpenSSL](https://github.com/openssl/openssl) and [LibreSSL](https://github.com/libressl-portable/portable). These are the version which are, or have been, tested:
|
||||||
|
|
||||||
|
| OpenSSL | LibreSSL |
|
||||||
|
| -------------- | --------------- |
|
||||||
|
| [1.0.2][1.0.2] | ![3.1.5][3.1] |
|
||||||
|
| 1.1.0 | ![3.2.3][3.2] |
|
||||||
|
| [1.1.1][1.1.1] | ![3.3.1][3.3] |
|
||||||
|
|
||||||
|
[1.0.2]: https://travis-ci.com/github/Thalhammer/jwt-cpp
|
||||||
|
[1.1.1]: https://github.com/Thalhammer/jwt-cpp/actions?query=workflow%3A%22Coverage+CI%22
|
||||||
|
[3.1]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Thalhammer/jwt-cpp/badges/libressl/3.1.5/shields.json
|
||||||
|
[3.2]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Thalhammer/jwt-cpp/badges/libressl/3.2.3/shields.json
|
||||||
|
[3.3]: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Thalhammer/jwt-cpp/badges/libressl/3.3.1/shields.json
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
There is no hard dependency on a JSON library. Instead, there's a generic `jwt::basic_claim` which is templated around type traits, which described the semantic [JSON types](https://json-schema.org/understanding-json-schema/reference/type.html) for a value, object, array, string, number, integer and boolean, as well as methods to translate between them.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
jwt::basic_claim<my_favorite_json_library_traits> claim(json::object({{"json", true},{"example", 0}}));
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows for complete freedom when picking which libraries you want to use. For more information, [see below](#providing-your-own-json-traits-your-traits).
|
||||||
|
|
||||||
|
In order to maintain compatibility, [picojson](https://github.com/kazuho/picojson) is still used to provide a specialized `jwt::claim` along with all helpers. Defining `JWT_DISABLE_PICOJSON` will remove this optional dependency.
|
||||||
|
|
||||||
|
As for the base64 requirements of JWTs, this libary provides `base.h` with all the required implentation; However base64 implementations are very common, with varying degrees of performance. When providing your own base64 implementation, you can define `JWT_DISABLE_BASE64` to remove the jwt-cpp implementation.
|
||||||
|
|
||||||
|
### Getting Started
|
||||||
|
|
||||||
|
Simple example of decoding a token and printing all [claims](https://tools.ietf.org/html/rfc7519#section-4) ([try it out](https://github.com/Thalhammer/jwt-cpp/tree/master/example/print-claims.cpp)):
|
||||||
|
|
||||||
|
```cpp
|
||||||
#include <jwt-cpp/jwt.h>
|
#include <jwt-cpp/jwt.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
int main(int argc, const char** argv) {
|
int main() {
|
||||||
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
|
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
|
||||||
auto decoded = jwt::decode(token);
|
auto decoded = jwt::decode(token);
|
||||||
|
|
||||||
for(auto& e : decoded.get_payload_claims())
|
for(auto& e : decoded.get_payload_claims())
|
||||||
std::cout << e.first << " = " << e.second.to_json() << std::endl;
|
std::cout << e.first << " = " << e.second << std::endl;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
In order to verify a token you first build a verifier and use it to verify a decoded token.
|
In order to verify a token you first build a verifier and use it to verify a decoded token.
|
||||||
```c++
|
|
||||||
|
```cpp
|
||||||
auto verifier = jwt::verify()
|
auto verifier = jwt::verify()
|
||||||
.allow_algorithm(jwt::algorithm::hs256{ "secret" })
|
.allow_algorithm(jwt::algorithm::hs256{ "secret" })
|
||||||
.with_issuer("auth0");
|
.with_issuer("auth0");
|
||||||
|
|
||||||
verifier.verify(decoded_token);
|
verifier.verify(decoded_token);
|
||||||
```
|
```
|
||||||
|
|
||||||
The created verifier is stateless so you can reuse it for different tokens.
|
The created verifier is stateless so you can reuse it for different tokens.
|
||||||
|
|
||||||
Creating a token (and signing) is equally easy.
|
Creating a token (and signing) is equally as easy.
|
||||||
```c++
|
|
||||||
|
```cpp
|
||||||
auto token = jwt::create()
|
auto token = jwt::create()
|
||||||
.set_issuer("auth0")
|
.set_issuer("auth0")
|
||||||
.set_type("JWS")
|
.set_type("JWS")
|
||||||
.set_payload_claim("sample", std::string("test"))
|
.set_payload_claim("sample", jwt::claim(std::string("test")))
|
||||||
.sign(jwt::algorithm::hs256{"secret"});
|
.sign(jwt::algorithm::hs256{"secret"});
|
||||||
```
|
```
|
||||||
|
|
||||||
Here is a simple example of creating a token that will expire in 2 hours:
|
Here is a simple example of creating a token that will expire in one hour:
|
||||||
|
|
||||||
```c++
|
```cpp
|
||||||
|
auto token = jwt::create()
|
||||||
|
.set_issuer("auth0")
|
||||||
|
.set_issued_at(std::chrono::system_clock::now())
|
||||||
|
.set_expires_at(std::chrono::system_clock::now() + std::chrono::seconds{3600})
|
||||||
|
.sign(jwt::algorithm::hs256{"secret"});
|
||||||
|
```
|
||||||
|
|
||||||
// Note to @Thalhammer: please replace with a better example if this is not a good way
|
> To see more examples working with RSA public and private keys, visit our [examples](https://github.com/Thalhammer/jwt-cpp/tree/master/example)!
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_issued_at(jwt::date(std::chrono::system_clock::now()))
|
|
||||||
.set_expires_at(jwt::date(std::chrono::system_clock::now()+ std::chrono::seconds{3600}))
|
|
||||||
.sign(jwt::algorithm::hs256{"secret"}
|
|
||||||
|
|
||||||
|
### Providing your own JSON Traits
|
||||||
|
|
||||||
|
There are several key items that need to be provided to a `jwt::basic_claim` in order for it to be interoptable with you JSON library of choice.
|
||||||
|
|
||||||
|
* type specifications
|
||||||
|
* conversion from generic "value type" to a specific type
|
||||||
|
* serialization and parsing
|
||||||
|
|
||||||
|
If ever you are not sure, the traits are heavily checked against static asserts to make sure you provide everything that's required.
|
||||||
|
|
||||||
|
> :warning: Not all JSON libraries are a like, you may need to extent certain types such that it can be used by jwt-cpp. See this [example](https://github.com/Thalhammer/jwt-cpp/blob/ac3de9e69bc698a464dacb256a1b50512843f092/tests/jsoncons/JsonconsTest.cpp).
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
struct my_favorite_json_library_traits {
|
||||||
|
// Type Specifications
|
||||||
|
using value_type = json; // The generic "value type" implementation, most libraries have one
|
||||||
|
using object_type = json::object_t; // The "map type" string to value
|
||||||
|
using array_type = json::array_t; // The "list type" array of values
|
||||||
|
using string_type = std::string; // The "list of chars", must be a narrow char
|
||||||
|
using number_type = double; // The "percision type"
|
||||||
|
using integer_type = int64_t; // The "integral type"
|
||||||
|
using boolean_type = bool; // The "boolean type"
|
||||||
|
|
||||||
|
// Translation between the implementation notion of type, to the jwt::json::type equivilant
|
||||||
|
static jwt::json::type get_type(const value_type &val) {
|
||||||
|
using jwt::json::type;
|
||||||
|
|
||||||
|
if (val.type() == json::value_t::object)
|
||||||
|
return type::object;
|
||||||
|
if (val.type() == json::value_t::array)
|
||||||
|
return type::array;
|
||||||
|
if (val.type() == json::value_t::string)
|
||||||
|
return type::string;
|
||||||
|
if (val.type() == json::value_t::number_float)
|
||||||
|
return type::number;
|
||||||
|
if (val.type() == json::value_t::number_integer)
|
||||||
|
return type::integer;
|
||||||
|
if (val.type() == json::value_t::boolean)
|
||||||
|
return type::boolean;
|
||||||
|
|
||||||
|
throw std::logic_error("invalid type");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Conversion from generic value to specific type
|
||||||
|
static object_type as_object(const value_type &val);
|
||||||
|
static array_type as_array(const value_type &val);
|
||||||
|
static string_type as_string(const value_type &val);
|
||||||
|
static number_type as_number(const value_type &val);
|
||||||
|
static integer_type as_int(const value_type &val);
|
||||||
|
static boolean_type as_bool(const value_type &val);
|
||||||
|
|
||||||
|
// serilization and parsing
|
||||||
|
static bool parse(value_type &val, string_type str);
|
||||||
|
static string_type serialize(const value_type &val); // with no extra whitespace, padding or indentation
|
||||||
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
If you have an improvement or found a bug feel free to [open an issue](https://github.com/Thalhammer/jwt-cpp/issues/new) or add the change and create a pull request. If you file a bug please make sure to include as much information about your environment (compiler version, etc.) as possible to help reproduce the issue. If you add a new feature please make sure to also include test cases for it.
|
If you have an improvement or found a bug feel free to [open an issue](https://github.com/Thalhammer/jwt-cpp/issues/new) or add the change and create a pull request. If you file a bug please make sure to include as much information about your environment (compiler version, etc.) as possible to help reproduce the issue. If you add a new feature please make sure to also include test cases for it.
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
In order to use jwt-cpp you need the following tools.
|
In order to use jwt-cpp you need the following tools.
|
||||||
|
|
||||||
* libcrypto (openssl or compatible)
|
* libcrypto (openssl or compatible)
|
||||||
* libssl-dev (for the header files)
|
* libssl-dev (for the header files)
|
||||||
* a compiler supporting at least c++11
|
* a compiler supporting at least c++11
|
||||||
* basic stl support
|
* basic stl support
|
||||||
|
|
||||||
In order to build the test cases you also need
|
In order to build the test cases you also need
|
||||||
* gtest installed in linker path
|
|
||||||
|
* gtest
|
||||||
* pthread
|
* pthread
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
#### Expired tokens
|
|
||||||
If you are generating tokens that seem to immediately expire, you are likely not using UTC. Specifically,
|
|
||||||
if you use `get_time` to get the current time, it likely uses localtime, while this library uses UTC, which may be why your token is immediately expiring. Please see example above on the right way to use current time.
|
|
||||||
|
|
||||||
#### Missing _HMAC amd _EVP_sha256 symbols on Mac
|
### Expired tokens
|
||||||
|
|
||||||
|
If you are generating tokens that seem to immediately expire, you are likely not using UTC. Specifically,
|
||||||
|
if you use `get_time` to get the current time, it likely uses localtime, while this library uses UTC,
|
||||||
|
which may be why your token is immediately expiring. Please see example above on the right way to use current time.
|
||||||
|
|
||||||
|
### Missing \_HMAC and \_EVP_sha256 symbols on Mac
|
||||||
|
|
||||||
There seems to exists a problem with the included openssl library of MacOS. Make sure you link to one provided by brew.
|
There seems to exists a problem with the included openssl library of MacOS. Make sure you link to one provided by brew.
|
||||||
See [here](https://github.com/Thalhammer/jwt-cpp/issues/6) for more details.
|
See [here](https://github.com/Thalhammer/jwt-cpp/issues/6) for more details.
|
||||||
#### Building on windows fails with syntax errors
|
|
||||||
The header "Windows.h", which is often included in windowsprojects, defines macros for MIN and MAX which screw up std::numeric_limits.
|
### Building on windows fails with syntax errors
|
||||||
|
|
||||||
|
The header `<Windows.h>`, which is often included in windowsprojects, defines macros for MIN and MAX which screw up std::numeric_limits.
|
||||||
See [here](https://github.com/Thalhammer/jwt-cpp/issues/5) for more details. To fix this do one of the following things:
|
See [here](https://github.com/Thalhammer/jwt-cpp/issues/5) for more details. To fix this do one of the following things:
|
||||||
|
|
||||||
* define NOMINMAX, which suppresses this behaviour
|
* define NOMINMAX, which suppresses this behaviour
|
||||||
* include this library before you include windows.h
|
* include this library before you include windows.h
|
||||||
* place ```#undef max``` and ```#undef min``` before you include this library
|
* place `#undef max` and `#undef min` before you include this library
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
::testing::InitGoogleTest(&argc, argv);
|
|
||||||
return RUN_ALL_TESTS();
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include "include/jwt-cpp/jwt.h"
|
|
||||||
|
|
||||||
TEST(TokenFormatTest, MissingDot) {
|
|
||||||
ASSERT_THROW(jwt::decode("eyJhbGciOiJub25lIiwidHlwIjoiSldTIn0.eyJpc3MiOiJhdXRoMCJ9"), std::invalid_argument);
|
|
||||||
ASSERT_THROW(jwt::decode("eyJhbGciOiJub25lIiwidHlwIjoiSldTIn0eyJpc3MiOiJhdXRoMCJ9."), std::invalid_argument);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenFormatTest, InvalidChar) {
|
|
||||||
ASSERT_THROW(jwt::decode("eyJhbGciOiJub25lIiwidHlwIjoiSldTIn0().eyJpc3MiOiJhdXRoMCJ9."), std::runtime_error);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenFormatTest, InvalidJSON) {
|
|
||||||
ASSERT_THROW(jwt::decode("YXsiYWxnIjoibm9uZSIsInR5cCI6IkpXUyJ9YQ.eyJpc3MiOiJhdXRoMCJ9."), std::runtime_error);
|
|
||||||
}
|
|
|
@ -1,420 +0,0 @@
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include "include/jwt-cpp/jwt.h"
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
extern std::string rsa_priv_key;
|
|
||||||
extern std::string rsa_pub_key;
|
|
||||||
extern std::string rsa_pub_key_invalid;
|
|
||||||
extern std::string rsa512_priv_key;
|
|
||||||
extern std::string rsa512_pub_key;
|
|
||||||
extern std::string rsa512_pub_key_invalid;
|
|
||||||
extern std::string ecdsa_priv_key;
|
|
||||||
extern std::string ecdsa_pub_key;
|
|
||||||
extern std::string ecdsa_pub_key_invalid;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, DecodeToken) {
|
|
||||||
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
|
|
||||||
auto decoded = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_TRUE(decoded.has_algorithm());
|
|
||||||
ASSERT_TRUE(decoded.has_type());
|
|
||||||
ASSERT_FALSE(decoded.has_content_type());
|
|
||||||
ASSERT_FALSE(decoded.has_key_id());
|
|
||||||
ASSERT_TRUE(decoded.has_issuer());
|
|
||||||
ASSERT_FALSE(decoded.has_subject());
|
|
||||||
ASSERT_FALSE(decoded.has_audience());
|
|
||||||
ASSERT_FALSE(decoded.has_expires_at());
|
|
||||||
ASSERT_FALSE(decoded.has_not_before());
|
|
||||||
ASSERT_FALSE(decoded.has_issued_at());
|
|
||||||
ASSERT_FALSE(decoded.has_id());
|
|
||||||
|
|
||||||
ASSERT_EQ("HS256", decoded.get_algorithm());
|
|
||||||
ASSERT_EQ("JWS", decoded.get_type());
|
|
||||||
ASSERT_EQ("auth0", decoded.get_issuer());
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateToken) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::none{});
|
|
||||||
ASSERT_EQ("eyJhbGciOiJub25lIiwidHlwIjoiSldTIn0.eyJpc3MiOiJhdXRoMCJ9.", token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenHS256) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::hs256{"secret"});
|
|
||||||
ASSERT_EQ("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE", token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenRS256) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::rs256(rsa_pub_key, rsa_priv_key, "", ""));
|
|
||||||
|
|
||||||
ASSERT_EQ(
|
|
||||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.VA2i1ui1cnoD6I3wnji1WAVCf29EekysvevGrT2GXqK1dDMc8"
|
|
||||||
"HAZCTQxa1Q8NppnpYV-hlqxh-X3Bb0JOePTGzjynpNZoJh2aHZD-GKpZt7OO1Zp8AFWPZ3p8Cahq8536fD8RiBES9jRsvChZvOqA7gMcFc4"
|
|
||||||
"YD0iZhNIcI7a654u5yPYyTlf5kjR97prCf_OXWRn-bYY74zna4p_bP9oWCL4BkaoRcMxi-IR7kmVcCnvbYqyIrKloXP2qPO442RBGqU7Ov9"
|
|
||||||
"sGQxiVqtRHKXZR9RbfvjrErY1KGiCp9M5i2bsUHadZEY44FE2jiOmx-uc2z5c05CCXqVSpfCjWbh9gQ", token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenRS512) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::rs512(rsa512_pub_key, rsa512_priv_key, "", ""));
|
|
||||||
|
|
||||||
ASSERT_EQ(
|
|
||||||
"eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.GZhnjtsvBl2_KDSxg4JW6xnmNjr2mWhYSZSSQyLKvI0"
|
|
||||||
"TK86sJKchkt_HDy2IC5l5BGRhq_Xv9pHdA1umidQZG3a7gWvHsujqybCBgBraMTd1wJrCl4QxFg2RYHhHbRqb9BnPJgFD_vryd4GB"
|
|
||||||
"hfGgejPBCBlGrQtqFGFdHHOjNHY", token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenPS256) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::ps256(rsa_pub_key, rsa_priv_key, "", ""));
|
|
||||||
|
|
||||||
// TODO: Find a better way to check if generated signature is valid
|
|
||||||
// Can't do simple check for equal since pss adds random salt.
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenPS384) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::ps384(rsa_pub_key, rsa_priv_key, "", ""));
|
|
||||||
|
|
||||||
// TODO: Find a better way to check if generated signature is valid
|
|
||||||
// Can't do simple check for equal since pss adds random salt.
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenPS512) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::ps512(rsa_pub_key, rsa_priv_key, "", ""));
|
|
||||||
|
|
||||||
// TODO: Find a better way to check if generated signature is valid
|
|
||||||
// Can't do simple check for equal since pss adds random salt.
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenES256) {
|
|
||||||
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::es256("", ecdsa_priv_key, "", ""));
|
|
||||||
|
|
||||||
auto decoded = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_THROW(jwt::verify().allow_algorithm(jwt::algorithm::es256(ecdsa_pub_key_invalid, "", "", "")).verify(decoded), jwt::signature_verification_exception);
|
|
||||||
ASSERT_NO_THROW(jwt::verify().allow_algorithm(jwt::algorithm::es256(ecdsa_pub_key, "", "", "")).verify(decoded));
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, CreateTokenES256NoPrivate) {
|
|
||||||
|
|
||||||
ASSERT_THROW([](){
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::es256(ecdsa_pub_key, "", "", ""));
|
|
||||||
}(), jwt::signature_generation_exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenRS256) {
|
|
||||||
std::string token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.VA2i1ui1cnoD6I3wnji1WAVCf29EekysvevGrT2GXqK1dDMc8"
|
|
||||||
"HAZCTQxa1Q8NppnpYV-hlqxh-X3Bb0JOePTGzjynpNZoJh2aHZD-GKpZt7OO1Zp8AFWPZ3p8Cahq8536fD8RiBES9jRsvChZvOqA7gMcFc4"
|
|
||||||
"YD0iZhNIcI7a654u5yPYyTlf5kjR97prCf_OXWRn-bYY74zna4p_bP9oWCL4BkaoRcMxi-IR7kmVcCnvbYqyIrKloXP2qPO442RBGqU7Ov9"
|
|
||||||
"sGQxiVqtRHKXZR9RbfvjrErY1KGiCp9M5i2bsUHadZEY44FE2jiOmx-uc2z5c05CCXqVSpfCjWbh9gQ";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::rs256(rsa_pub_key, rsa_priv_key, "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenRS256PublicOnly) {
|
|
||||||
std::string token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.VA2i1ui1cnoD6I3wnji1WAVCf29EekysvevGrT2GXqK1dDMc8"
|
|
||||||
"HAZCTQxa1Q8NppnpYV-hlqxh-X3Bb0JOePTGzjynpNZoJh2aHZD-GKpZt7OO1Zp8AFWPZ3p8Cahq8536fD8RiBES9jRsvChZvOqA7gMcFc4"
|
|
||||||
"YD0iZhNIcI7a654u5yPYyTlf5kjR97prCf_OXWRn-bYY74zna4p_bP9oWCL4BkaoRcMxi-IR7kmVcCnvbYqyIrKloXP2qPO442RBGqU7Ov9"
|
|
||||||
"sGQxiVqtRHKXZR9RbfvjrErY1KGiCp9M5i2bsUHadZEY44FE2jiOmx-uc2z5c05CCXqVSpfCjWbh9gQ";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::rs256(rsa_pub_key, "", "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenRS256Fail) {
|
|
||||||
std::string token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.VA2i1ui1cnoD6I3wnji1WAVCf29EekysvevGrT2GXqK1dDMc8"
|
|
||||||
"HAZCTQxa1Q8NppnpYV-hlqxh-X3Bb0JOePTGzjynpNZoJh2aHZD-GKpZt7OO1Zp8AFWPZ3p8Cahq8536fD8RiBES9jRsvChZvOqA7gMcFc4"
|
|
||||||
"YD0iZhNIcI7a654u5yPYyTlf5kjR97prCf_OXWRn-bYY74zna4p_bP9oWCL4BkaoRcMxi-IR7kmVcCnvbYqyIrKloXP2qPO442RBGqU7Ov9"
|
|
||||||
"sGQxiVqtRHKXZR9RbfvjrErY1KGiCp9M5i2bsUHadZEY44FE2jiOmx-uc2z5c05CCXqVSpfCjWbh9gQ";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::rs256(rsa_pub_key_invalid, "", "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::signature_verification_exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenRS512) {
|
|
||||||
std::string token = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.GZhnjtsvBl2_KDSxg4JW6xnmNjr2mWhYSZ"
|
|
||||||
"SSQyLKvI0TK86sJKchkt_HDy2IC5l5BGRhq_Xv9pHdA1umidQZG3a7gWvHsujqybCBgBraMTd1wJrCl4QxFg2RYHhHbRqb9BnPJgFD_vryd4"
|
|
||||||
"GBhfGgejPBCBlGrQtqFGFdHHOjNHY";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::rs512(rsa512_pub_key, rsa512_priv_key, "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenRS512PublicOnly) {
|
|
||||||
std::string token = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.GZhnjtsvBl2_KDSxg4JW6xnmNjr2mWhYSZ"
|
|
||||||
"SSQyLKvI0TK86sJKchkt_HDy2IC5l5BGRhq_Xv9pHdA1umidQZG3a7gWvHsujqybCBgBraMTd1wJrCl4QxFg2RYHhHbRqb9BnPJgFD_vryd4"
|
|
||||||
"GBhfGgejPBCBlGrQtqFGFdHHOjNHY";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::rs512(rsa512_pub_key, "", "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenRS512Fail) {
|
|
||||||
std::string token = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.GZhnjtsvBl2_KDSxg4JW6xnmNjr2mWhYSZ"
|
|
||||||
"SSQyLKvI0TK86sJKchkt_HDy2IC5l5BGRhq_Xv9pHdA1umidQZG3a7gWvHsujqybCBgBraMTd1wJrCl4QxFg2RYHhHbRqb9BnPJgFD_vryd4"
|
|
||||||
"GBhfGgejPBCBlGrQtqFGFdHHOjNHY";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::rs512(rsa_pub_key_invalid, "", "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::signature_verification_exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenHS256) {
|
|
||||||
std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::hs256{ "secret" })
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyFail) {
|
|
||||||
auto token = jwt::create()
|
|
||||||
.set_issuer("auth0")
|
|
||||||
.set_type("JWS")
|
|
||||||
.sign(jwt::algorithm::none{});
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
{
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::none{})
|
|
||||||
.with_issuer("auth");
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::token_verification_exception);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::none{})
|
|
||||||
.with_issuer("auth0")
|
|
||||||
.with_audience({ "test" });
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::token_verification_exception);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::none{})
|
|
||||||
.with_issuer("auth0")
|
|
||||||
.with_subject("test");
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::token_verification_exception);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::none{})
|
|
||||||
.with_issuer("auth0")
|
|
||||||
.with_claim("myclaim", jwt::claim(std::string("test")));
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::token_verification_exception);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenES256) {
|
|
||||||
const std::string token = "eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJhdXRoMCJ9.4iVk3-Y0v4RT4_9IaQlp-8dZ_4fsTzIylgrPTDLrEvTHBTyVS3tgPbr2_IZfLETtiKRqCg0aQ5sh9eIsTTwB1g";
|
|
||||||
|
|
||||||
auto verify = jwt::verify().allow_algorithm(jwt::algorithm::es256(ecdsa_pub_key, "", "", ""));
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenES256Fail) {
|
|
||||||
const std::string token = "eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJhdXRoMCJ9.4iVk3-Y0v4RT4_9IaQlp-8dZ_4fsTzIylgrPTDLrEvTHBTyVS3tgPbr2_IZfLETtiKRqCg0aQ5sh9eIsTTwB1g";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::es256(ecdsa_pub_key_invalid, "", "", ""));
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::signature_verification_exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenPS256) {
|
|
||||||
std::string token = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.CJ4XjVWdbV6vXGZkD4GdJbtYc80SN9cmPOqRhZBRzOyDRqTFE"
|
|
||||||
"4MsbdKyQuhAWcvuMOjn-24qOTjVMR_P_uTC1uG6WPLcucxZyLnbb56zbKnEklW2SX0mQnCGewr-93a_vDaFT6Cp45MsF_OwFPRCMaS5CJg-"
|
|
||||||
"N5KY67UrVSr3s9nkuK9ZTQkyODHfyEUh9F_FhRCATGrb5G7_qHqBYvTvaPUXqzhhpCjN855Tocg7A24Hl0yMwM-XdasucW5xNdKjG_YCkis"
|
|
||||||
"HX7ax--JiF5GNYCO61eLFteO4THUg-3Z0r4OlGqlppyWo5X5tjcxOZCvBh7WDWfkxA48KFZPRv0nlKA";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::ps256(rsa_pub_key, rsa_priv_key, "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenPS256PublicOnly) {
|
|
||||||
std::string token = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.CJ4XjVWdbV6vXGZkD4GdJbtYc80SN9cmPOqRhZBRzOyDRqTFE"
|
|
||||||
"4MsbdKyQuhAWcvuMOjn-24qOTjVMR_P_uTC1uG6WPLcucxZyLnbb56zbKnEklW2SX0mQnCGewr-93a_vDaFT6Cp45MsF_OwFPRCMaS5CJg-"
|
|
||||||
"N5KY67UrVSr3s9nkuK9ZTQkyODHfyEUh9F_FhRCATGrb5G7_qHqBYvTvaPUXqzhhpCjN855Tocg7A24Hl0yMwM-XdasucW5xNdKjG_YCkis"
|
|
||||||
"HX7ax--JiF5GNYCO61eLFteO4THUg-3Z0r4OlGqlppyWo5X5tjcxOZCvBh7WDWfkxA48KFZPRv0nlKA";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::ps256(rsa_pub_key, "", "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
verify.verify(decoded_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(TokenTest, VerifyTokenPS256Fail) {
|
|
||||||
std::string token = "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.CJ4XjVWdbV6vXGZkD4GdJbtYc80SN9cmPOqRhZBRzOyDRqTFE"
|
|
||||||
"4MsbdKyQuhAWcvuMOjn-24qOTjVMR_P_uTC1uG6WPLcucxZyLnbb56zbKnEklW2SX0mQnCGewr-93a_vDaFT6Cp45MsF_OwFPRCMaS5CJg-"
|
|
||||||
"N5KY67UrVSr3s9nkuK9ZTQkyODHfyEUh9F_FhRCATGrb5G7_qHqBYvTvaPUXqzhhpCjN855Tocg7A24Hl0yMwM-XdasucW5xNdKjG_YCkis"
|
|
||||||
"HX7ax--JiF5GNYCO61eLFteO4THUg-3Z0r4OlGqlppyWo5X5tjcxOZCvBh7WDWfkxA48KFZPRv0nlKA";
|
|
||||||
|
|
||||||
auto verify = jwt::verify()
|
|
||||||
.allow_algorithm(jwt::algorithm::ps256(rsa_pub_key_invalid, "", "", ""))
|
|
||||||
.with_issuer("auth0");
|
|
||||||
|
|
||||||
auto decoded_token = jwt::decode(token);
|
|
||||||
|
|
||||||
ASSERT_THROW(verify.verify(decoded_token), jwt::signature_verification_exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
std::string rsa_priv_key = R"(-----BEGIN PRIVATE KEY-----
|
|
||||||
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4ZtdaIrd1BPIJ
|
|
||||||
tfnF0TjIK5inQAXZ3XlCrUlJdP+XHwIRxdv1FsN12XyMYO/6ymLmo9ryoQeIrsXB
|
|
||||||
XYqlET3zfAY+diwCb0HEsVvhisthwMU4gZQu6TYW2s9LnXZB5rVtcBK69hcSlA2k
|
|
||||||
ZudMZWxZcj0L7KMfO2rIvaHw/qaVOE9j0T257Z8Kp2CLF9MUgX0ObhIsdumFRLaL
|
|
||||||
DvDUmBPr2zuh/34j2XmWwn1yjN/WvGtdfhXW79Ki1S40HcWnygHgLV8sESFKUxxQ
|
|
||||||
mKvPUTwDOIwLFL5WtE8Mz7N++kgmDcmWMCHc8kcOIu73Ta/3D4imW7VbKgHZo9+K
|
|
||||||
3ESFE3RjAgMBAAECggEBAJTEIyjMqUT24G2FKiS1TiHvShBkTlQdoR5xvpZMlYbN
|
|
||||||
tVWxUmrAGqCQ/TIjYnfpnzCDMLhdwT48Ab6mQJw69MfiXwc1PvwX1e9hRscGul36
|
|
||||||
ryGPKIVQEBsQG/zc4/L2tZe8ut+qeaK7XuYrPp8bk/X1e9qK5m7j+JpKosNSLgJj
|
|
||||||
NIbYsBkG2Mlq671irKYj2hVZeaBQmWmZxK4fw0Istz2WfN5nUKUeJhTwpR+JLUg4
|
|
||||||
ELYYoB7EO0Cej9UBG30hbgu4RyXA+VbptJ+H042K5QJROUbtnLWuuWosZ5ATldwO
|
|
||||||
u03dIXL0SH0ao5NcWBzxU4F2sBXZRGP2x/jiSLHcqoECgYEA4qD7mXQpu1b8XO8U
|
|
||||||
6abpKloJCatSAHzjgdR2eRDRx5PMvloipfwqA77pnbjTUFajqWQgOXsDTCjcdQui
|
|
||||||
wf5XAaWu+TeAVTytLQbSiTsBhrnoqVrr3RoyDQmdnwHT8aCMouOgcC5thP9vQ8Us
|
|
||||||
rVdjvRRbnJpg3BeSNimH+u9AHgsCgYEA0EzcbOltCWPHRAY7B3Ge/AKBjBQr86Kv
|
|
||||||
TdpTlxePBDVIlH+BM6oct2gaSZZoHbqPjbq5v7yf0fKVcXE4bSVgqfDJ/sZQu9Lp
|
|
||||||
PTeV7wkk0OsAMKk7QukEpPno5q6tOTNnFecpUhVLLlqbfqkB2baYYwLJR3IRzboJ
|
|
||||||
FQbLY93E8gkCgYB+zlC5VlQbbNqcLXJoImqItgQkkuW5PCgYdwcrSov2ve5r/Acz
|
|
||||||
FNt1aRdSlx4176R3nXyibQA1Vw+ztiUFowiP9WLoM3PtPZwwe4bGHmwGNHPIfwVG
|
|
||||||
m+exf9XgKKespYbLhc45tuC08DATnXoYK7O1EnUINSFJRS8cezSI5eHcbQKBgQDC
|
|
||||||
PgqHXZ2aVftqCc1eAaxaIRQhRmY+CgUjumaczRFGwVFveP9I6Gdi+Kca3DE3F9Pq
|
|
||||||
PKgejo0SwP5vDT+rOGHN14bmGJUMsX9i4MTmZUZ5s8s3lXh3ysfT+GAhTd6nKrIE
|
|
||||||
kM3Nh6HWFhROptfc6BNusRh1kX/cspDplK5x8EpJ0QKBgQDWFg6S2je0KtbV5PYe
|
|
||||||
RultUEe2C0jYMDQx+JYxbPmtcopvZQrFEur3WKVuLy5UAy7EBvwMnZwIG7OOohJb
|
|
||||||
vkSpADK6VPn9lbqq7O8cTedEHttm6otmLt8ZyEl3hZMaL3hbuRj6ysjmoFKx6CrX
|
|
||||||
rK0/Ikt5ybqUzKCMJZg2VKGTxg==
|
|
||||||
-----END PRIVATE KEY-----)";
|
|
||||||
std::string rsa_pub_key = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuGbXWiK3dQTyCbX5xdE4
|
|
||||||
yCuYp0AF2d15Qq1JSXT/lx8CEcXb9RbDddl8jGDv+spi5qPa8qEHiK7FwV2KpRE9
|
|
||||||
83wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVs
|
|
||||||
WXI9C+yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT
|
|
||||||
69s7of9+I9l5lsJ9cozf1rxrXX4V1u/SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8
|
|
||||||
AziMCxS+VrRPDM+zfvpIJg3JljAh3PJHDiLu902v9w+Iplu1WyoB2aPfitxEhRN0
|
|
||||||
YwIDAQAB
|
|
||||||
-----END PUBLIC KEY-----)";
|
|
||||||
std::string rsa_pub_key_invalid = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzYuc22QSst/dS7geYYK
|
|
||||||
5l5kLxU0tayNdixkEQ17ix+CUcUbKIsnyftZxaCYT46rQtXgCaYRdJcbB3hmyrOa
|
|
||||||
vkhTpX79xJZnQmfuamMbZBqitvscxW9zRR9tBUL6vdi/0rpoUwPMEh8+Bw7CgYR0
|
|
||||||
FK0DhWYBNDfe9HKcyZEv3max8Cdq18htxjEsdYO0iwzhtKRXomBWTdhD5ykd/fAC
|
|
||||||
VTr4+KEY+IeLvubHVmLUhbE5NgWXxrRpGasDqzKhCTmsa2Ysf712rl57SlH0Wz/M
|
|
||||||
r3F7aM9YpErzeYLrl0GhQr9BVJxOvXcVd4kmY+XkiCcrkyS1cnghnllh+LCwQu1s
|
|
||||||
YwIDAQAB
|
|
||||||
-----END PUBLIC KEY-----)";
|
|
||||||
std::string rsa512_priv_key = R"(-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
MIICWwIBAAKBgQDdlatRjRjogo3WojgGHFHYLugdUWAY9iR3fy4arWNA1KoS8kVw
|
|
||||||
33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQsHUfQrSDv+MuSUMAe8jzKE4qW
|
|
||||||
+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5Do2kQ+X5xK9cipRgEKwIDAQAB
|
|
||||||
AoGAD+onAtVye4ic7VR7V50DF9bOnwRwNXrARcDhq9LWNRrRGElESYYTQ6EbatXS
|
|
||||||
3MCyjjX2eMhu/aF5YhXBwkppwxg+EOmXeh+MzL7Zh284OuPbkglAaGhV9bb6/5Cp
|
|
||||||
uGb1esyPbYW+Ty2PC0GSZfIXkXs76jXAu9TOBvD0ybc2YlkCQQDywg2R/7t3Q2OE
|
|
||||||
2+yo382CLJdrlSLVROWKwb4tb2PjhY4XAwV8d1vy0RenxTB+K5Mu57uVSTHtrMK0
|
|
||||||
GAtFr833AkEA6avx20OHo61Yela/4k5kQDtjEf1N0LfI+BcWZtxsS3jDM3i1Hp0K
|
|
||||||
Su5rsCPb8acJo5RO26gGVrfAsDcIXKC+bQJAZZ2XIpsitLyPpuiMOvBbzPavd4gY
|
|
||||||
6Z8KWrfYzJoI/Q9FuBo6rKwl4BFoToD7WIUS+hpkagwWiz+6zLoX1dbOZwJACmH5
|
|
||||||
fSSjAkLRi54PKJ8TFUeOP15h9sQzydI8zJU+upvDEKZsZc/UhT/SySDOxQ4G/523
|
|
||||||
Y0sz/OZtSWcol/UMgQJALesy++GdvoIDLfJX5GBQpuFgFenRiRDabxrE9MNUZ2aP
|
|
||||||
FaFp+DyAe+b4nDwuJaW2LURbr8AEZga7oQj0uYxcYw==
|
|
||||||
-----END RSA PRIVATE KEY-----)";
|
|
||||||
std::string rsa512_pub_key = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdlatRjRjogo3WojgGHFHYLugd
|
|
||||||
UWAY9iR3fy4arWNA1KoS8kVw33cJibXr8bvwUAUparCwlvdbH6dvEOfou0/gCFQs
|
|
||||||
HUfQrSDv+MuSUMAe8jzKE4qW+jK+xQU9a03GUnKHkkle+Q0pX/g6jXZ7r1/xAK5D
|
|
||||||
o2kQ+X5xK9cipRgEKwIDAQAB
|
|
||||||
-----END PUBLIC KEY-----)";
|
|
||||||
std::string rsa512_pub_key_invalid = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzYuc22QSst/dS7geYYK
|
|
||||||
5l5kLxU0tayNdixkEQ17ix+CUcUbKIsnyftZxaCYT46rQtXgCaYRdJcbB3hmyrOa
|
|
||||||
vkhTpX79xJZnQmfuamMbZBqitvscxW9zRR9tBUL6vdi/0rpoUwPMEh8+Bw7CgYR0
|
|
||||||
FK0DhWYBNDfe9HKcyZEv3max8Cdq18htxjEsdYO0iwzhtKRXomBWTdhD5ykd/fAC
|
|
||||||
VTr4+KEY+IeLvubHVmLUhbE5NgWXxrRpGasDqzKhCTmsa2Ysf712rl57SlH0Wz/M
|
|
||||||
r3F7aM9YpErzeYLrl0GhQr9BVJxOvXcVd4kmY+XkiCcrkyS1cnghnllh+LCwQu1s
|
|
||||||
YwIDAQAB
|
|
||||||
-----END PUBLIC KEY-----)";
|
|
||||||
std::string ecdsa_priv_key = R"(-----BEGIN PRIVATE KEY-----
|
|
||||||
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgPGJGAm4X1fvBuC1z
|
|
||||||
SpO/4Izx6PXfNMaiKaS5RUkFqEGhRANCAARCBvmeksd3QGTrVs2eMrrfa7CYF+sX
|
|
||||||
sjyGg+Bo5mPKGH4Gs8M7oIvoP9pb/I85tdebtKlmiCZHAZE5w4DfJSV6
|
|
||||||
-----END PRIVATE KEY-----)";
|
|
||||||
std::string ecdsa_pub_key = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQgb5npLHd0Bk61bNnjK632uwmBfr
|
|
||||||
F7I8hoPgaOZjyhh+BrPDO6CL6D/aW/yPObXXm7SpZogmRwGROcOA3yUleg==
|
|
||||||
-----END PUBLIC KEY-----)";
|
|
||||||
std::string ecdsa_pub_key_invalid = R"(-----BEGIN PUBLIC KEY-----
|
|
||||||
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
|
|
||||||
CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
|
|
||||||
-----END PUBLIC KEY-----)";
|
|
||||||
}
|
|
|
@ -1,39 +1,64 @@
|
||||||
#pragma once
|
#ifndef JWT_CPP_BASE_H
|
||||||
#include <string>
|
#define JWT_CPP_BASE_H
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#ifdef __has_cpp_attribute
|
||||||
|
#if __has_cpp_attribute(fallthrough)
|
||||||
|
#define JWT_FALLTHROUGH [[fallthrough]]
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JWT_FALLTHROUGH
|
||||||
|
#define JWT_FALLTHROUGH
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace jwt {
|
namespace jwt {
|
||||||
|
/**
|
||||||
|
* \brief character maps when encoding and decoding
|
||||||
|
*/
|
||||||
namespace alphabet {
|
namespace alphabet {
|
||||||
|
/**
|
||||||
|
* \brief valid list of characted when working with [Base64](https://tools.ietf.org/html/rfc3548)
|
||||||
|
*/
|
||||||
struct base64 {
|
struct base64 {
|
||||||
static const std::array<char, 64>& data() {
|
static const std::array<char, 64>& data() {
|
||||||
static std::array<char, 64> data = {
|
static constexpr std::array<char, 64> data{
|
||||||
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||||||
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||||||
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}};
|
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}};
|
||||||
return data;
|
return data;
|
||||||
};
|
}
|
||||||
static const std::string& fill() {
|
static const std::string& fill() {
|
||||||
static std::string fill = "=";
|
static std::string fill{"="};
|
||||||
return fill;
|
return fill;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* \brief valid list of characted when working with [Base64URL](https://tools.ietf.org/html/rfc4648)
|
||||||
|
*/
|
||||||
struct base64url {
|
struct base64url {
|
||||||
static const std::array<char, 64>& data() {
|
static const std::array<char, 64>& data() {
|
||||||
static std::array<char, 64> data = {
|
static constexpr std::array<char, 64> data{
|
||||||
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
|
||||||
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
|
||||||
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
|
||||||
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'}};
|
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'}};
|
||||||
return data;
|
return data;
|
||||||
};
|
}
|
||||||
static const std::string& fill() {
|
static const std::string& fill() {
|
||||||
static std::string fill = "%3d";
|
static std::string fill{"%3d"};
|
||||||
return fill;
|
return fill;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
} // namespace alphabet
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Alphabet generic methods for working with encoding/decoding the base64 family
|
||||||
|
*/
|
||||||
class base {
|
class base {
|
||||||
public:
|
public:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -44,18 +69,27 @@ namespace jwt {
|
||||||
static std::string decode(const std::string& base) {
|
static std::string decode(const std::string& base) {
|
||||||
return decode(base, T::data(), T::fill());
|
return decode(base, T::data(), T::fill());
|
||||||
}
|
}
|
||||||
|
template<typename T>
|
||||||
|
static std::string pad(const std::string& base) {
|
||||||
|
return pad(base, T::fill());
|
||||||
|
}
|
||||||
|
template<typename T>
|
||||||
|
static std::string trim(const std::string& base) {
|
||||||
|
return trim(base, T::fill());
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::string encode(const std::string& bin, const std::array<char, 64>& alphabet, const std::string& fill) {
|
static std::string encode(const std::string& bin, const std::array<char, 64>& alphabet,
|
||||||
|
const std::string& fill) {
|
||||||
size_t size = bin.size();
|
size_t size = bin.size();
|
||||||
std::string res;
|
std::string res;
|
||||||
|
|
||||||
// clear incomplete bytes
|
// clear incomplete bytes
|
||||||
size_t fast_size = size - size % 3;
|
size_t fast_size = size - size % 3;
|
||||||
for (size_t i = 0; i < fast_size;) {
|
for (size_t i = 0; i < fast_size;) {
|
||||||
uint32_t octet_a = (unsigned char)bin[i++];
|
uint32_t octet_a = static_cast<unsigned char>(bin[i++]);
|
||||||
uint32_t octet_b = (unsigned char)bin[i++];
|
uint32_t octet_b = static_cast<unsigned char>(bin[i++]);
|
||||||
uint32_t octet_c = (unsigned char)bin[i++];
|
uint32_t octet_c = static_cast<unsigned char>(bin[i++]);
|
||||||
|
|
||||||
uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
||||||
|
|
||||||
|
@ -65,14 +99,13 @@ namespace jwt {
|
||||||
res += alphabet[(triple >> 0 * 6) & 0x3F];
|
res += alphabet[(triple >> 0 * 6) & 0x3F];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fast_size == size)
|
if (fast_size == size) return res;
|
||||||
return res;
|
|
||||||
|
|
||||||
size_t mod = size % 3;
|
size_t mod = size % 3;
|
||||||
|
|
||||||
uint32_t octet_a = fast_size < size ? (unsigned char)bin[fast_size++] : 0;
|
uint32_t octet_a = fast_size < size ? static_cast<unsigned char>(bin[fast_size++]) : 0;
|
||||||
uint32_t octet_b = fast_size < size ? (unsigned char)bin[fast_size++] : 0;
|
uint32_t octet_b = fast_size < size ? static_cast<unsigned char>(bin[fast_size++]) : 0;
|
||||||
uint32_t octet_c = fast_size < size ? (unsigned char)bin[fast_size++] : 0;
|
uint32_t octet_c = fast_size < size ? static_cast<unsigned char>(bin[fast_size++]) : 0;
|
||||||
|
|
||||||
uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;
|
||||||
|
|
||||||
|
@ -89,14 +122,14 @@ namespace jwt {
|
||||||
res += alphabet[(triple >> 1 * 6) & 0x3F];
|
res += alphabet[(triple >> 1 * 6) & 0x3F];
|
||||||
res += fill;
|
res += fill;
|
||||||
break;
|
break;
|
||||||
default:
|
default: break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string decode(const std::string& base, const std::array<char, 64>& alphabet, const std::string& fill) {
|
static std::string decode(const std::string& base, const std::array<char, 64>& alphabet,
|
||||||
|
const std::string& fill) {
|
||||||
size_t size = base.size();
|
size_t size = base.size();
|
||||||
|
|
||||||
size_t fill_cnt = 0;
|
size_t fill_cnt = 0;
|
||||||
|
@ -104,14 +137,12 @@ namespace jwt {
|
||||||
if (base.substr(size - fill.size(), fill.size()) == fill) {
|
if (base.substr(size - fill.size(), fill.size()) == fill) {
|
||||||
fill_cnt++;
|
fill_cnt++;
|
||||||
size -= fill.size();
|
size -= fill.size();
|
||||||
if(fill_cnt > 2)
|
if (fill_cnt > 2) throw std::runtime_error("Invalid input");
|
||||||
throw std::runtime_error("Invalid input");
|
} else
|
||||||
}
|
break;
|
||||||
else break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((size + fill_cnt) % 4 != 0)
|
if ((size + fill_cnt) % 4 != 0) throw std::runtime_error("Invalid input");
|
||||||
throw std::runtime_error("Invalid input");
|
|
||||||
|
|
||||||
size_t out_size = size / 4 * 3;
|
size_t out_size = size / 4 * 3;
|
||||||
std::string res;
|
std::string res;
|
||||||
|
@ -119,13 +150,11 @@ namespace jwt {
|
||||||
|
|
||||||
auto get_sextet = [&](size_t offset) {
|
auto get_sextet = [&](size_t offset) {
|
||||||
for (size_t i = 0; i < alphabet.size(); i++) {
|
for (size_t i = 0; i < alphabet.size(); i++) {
|
||||||
if (alphabet[i] == base[offset])
|
if (alphabet[i] == base[offset]) return static_cast<uint32_t>(i);
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
throw std::runtime_error("Invalid input");
|
throw std::runtime_error("Invalid input");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
size_t fast_size = size - size % 4;
|
size_t fast_size = size - size % 4;
|
||||||
for (size_t i = 0; i < fast_size;) {
|
for (size_t i = 0; i < fast_size;) {
|
||||||
uint32_t sextet_a = get_sextet(i++);
|
uint32_t sextet_a = get_sextet(i++);
|
||||||
|
@ -133,36 +162,47 @@ namespace jwt {
|
||||||
uint32_t sextet_c = get_sextet(i++);
|
uint32_t sextet_c = get_sextet(i++);
|
||||||
uint32_t sextet_d = get_sextet(i++);
|
uint32_t sextet_d = get_sextet(i++);
|
||||||
|
|
||||||
uint32_t triple = (sextet_a << 3 * 6)
|
uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) + (sextet_c << 1 * 6) + (sextet_d << 0 * 6);
|
||||||
+ (sextet_b << 2 * 6)
|
|
||||||
+ (sextet_c << 1 * 6)
|
|
||||||
+ (sextet_d << 0 * 6);
|
|
||||||
|
|
||||||
res += (triple >> 2 * 8) & 0xFF;
|
res += static_cast<char>((triple >> 2 * 8) & 0xFFU);
|
||||||
res += (triple >> 1 * 8) & 0xFF;
|
res += static_cast<char>((triple >> 1 * 8) & 0xFFU);
|
||||||
res += (triple >> 0 * 8) & 0xFF;
|
res += static_cast<char>((triple >> 0 * 8) & 0xFFU);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fill_cnt == 0)
|
if (fill_cnt == 0) return res;
|
||||||
return res;
|
|
||||||
|
|
||||||
uint32_t triple = (get_sextet(fast_size) << 3 * 6)
|
uint32_t triple = (get_sextet(fast_size) << 3 * 6) + (get_sextet(fast_size + 1) << 2 * 6);
|
||||||
+ (get_sextet(fast_size + 1) << 2 * 6);
|
|
||||||
|
|
||||||
switch (fill_cnt) {
|
switch (fill_cnt) {
|
||||||
case 1:
|
case 1:
|
||||||
triple |= (get_sextet(fast_size + 2) << 1 * 6);
|
triple |= (get_sextet(fast_size + 2) << 1 * 6);
|
||||||
res += (triple >> 2 * 8) & 0xFF;
|
res += static_cast<char>((triple >> 2 * 8) & 0xFFU);
|
||||||
res += (triple >> 1 * 8) & 0xFF;
|
res += static_cast<char>((triple >> 1 * 8) & 0xFFU);
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
res += (triple >> 2 * 8) & 0xFF;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
|
case 2: res += static_cast<char>((triple >> 2 * 8) & 0xFFU); break;
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::string pad(const std::string& base, const std::string& fill) {
|
||||||
|
std::string padding;
|
||||||
|
switch (base.size() % 4) {
|
||||||
|
case 1: padding += fill; JWT_FALLTHROUGH;
|
||||||
|
case 2: padding += fill; JWT_FALLTHROUGH;
|
||||||
|
case 3: padding += fill; JWT_FALLTHROUGH;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base + padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
static std::string trim(const std::string& base, const std::string& fill) {
|
||||||
|
auto pos = base.find(fill);
|
||||||
|
return base.substr(0, pos);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
} // namespace jwt
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -76,8 +76,14 @@ extern "C" {
|
||||||
// experimental support for int64_t (see README.mkdn for detail)
|
// experimental support for int64_t (see README.mkdn for detail)
|
||||||
#ifdef PICOJSON_USE_INT64
|
#ifdef PICOJSON_USE_INT64
|
||||||
#define __STDC_FORMAT_MACROS
|
#define __STDC_FORMAT_MACROS
|
||||||
#include <errno.h>
|
#include <cerrno>
|
||||||
|
#if __cplusplus >= 201103L
|
||||||
|
#include <cinttypes>
|
||||||
|
#else
|
||||||
|
extern "C" {
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// to disable the use of localeconv(3), set PICOJSON_USE_LOCALE to 0
|
// to disable the use of localeconv(3), set PICOJSON_USE_LOCALE to 0
|
||||||
|
@ -104,6 +110,7 @@ extern "C" {
|
||||||
#pragma warning(disable : 4244) // conversion from int to char
|
#pragma warning(disable : 4244) // conversion from int to char
|
||||||
#pragma warning(disable : 4127) // conditional expression is constant
|
#pragma warning(disable : 4127) // conditional expression is constant
|
||||||
#pragma warning(disable : 4702) // unreachable code
|
#pragma warning(disable : 4702) // unreachable code
|
||||||
|
#pragma warning(disable : 4706) // assignment within conditional expression
|
||||||
#else
|
#else
|
||||||
#define SNPRINTF snprintf
|
#define SNPRINTF snprintf
|
||||||
#endif
|
#endif
|
||||||
|
@ -123,7 +130,7 @@ enum {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
enum { INDENT_WIDTH = 2 };
|
enum { INDENT_WIDTH = 2, DEFAULT_MAX_DEPTHS = 100 };
|
||||||
|
|
||||||
struct null {};
|
struct null {};
|
||||||
|
|
||||||
|
@ -377,7 +384,7 @@ GET(array, *u_.array_)
|
||||||
GET(object, *u_.object_)
|
GET(object, *u_.object_)
|
||||||
#ifdef PICOJSON_USE_INT64
|
#ifdef PICOJSON_USE_INT64
|
||||||
GET(double,
|
GET(double,
|
||||||
(type_ == int64_type && (const_cast<value *>(this)->type_ = number_type, const_cast<value *>(this)->u_.number_ = u_.int64_),
|
(type_ == int64_type && (const_cast<value *>(this)->type_ = number_type, (const_cast<value *>(this)->u_.number_ = u_.int64_)),
|
||||||
u_.number_))
|
u_.number_))
|
||||||
GET(int64_t, u_.int64_)
|
GET(int64_t, u_.int64_)
|
||||||
#else
|
#else
|
||||||
|
@ -832,7 +839,7 @@ template <typename Context, typename Iter> inline bool _parse_object(Context &ct
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (in.expect('}')) {
|
if (in.expect('}')) {
|
||||||
return true;
|
return ctx.parse_object_stop();
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
std::string key;
|
std::string key;
|
||||||
|
@ -843,7 +850,7 @@ template <typename Context, typename Iter> inline bool _parse_object(Context &ct
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} while (in.expect(','));
|
} while (in.expect(','));
|
||||||
return in.expect('}');
|
return in.expect('}') && ctx.parse_object_stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Iter> inline std::string _parse_number(input<Iter> &in) {
|
template <typename Iter> inline std::string _parse_number(input<Iter> &in) {
|
||||||
|
@ -959,9 +966,10 @@ public:
|
||||||
class default_parse_context {
|
class default_parse_context {
|
||||||
protected:
|
protected:
|
||||||
value *out_;
|
value *out_;
|
||||||
|
size_t depths_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
default_parse_context(value *out) : out_(out) {
|
default_parse_context(value *out, size_t depths = DEFAULT_MAX_DEPTHS) : out_(out), depths_(depths) {
|
||||||
}
|
}
|
||||||
bool set_null() {
|
bool set_null() {
|
||||||
*out_ = value();
|
*out_ = value();
|
||||||
|
@ -986,27 +994,37 @@ public:
|
||||||
return _parse_string(out_->get<std::string>(), in);
|
return _parse_string(out_->get<std::string>(), in);
|
||||||
}
|
}
|
||||||
bool parse_array_start() {
|
bool parse_array_start() {
|
||||||
|
if (depths_ == 0)
|
||||||
|
return false;
|
||||||
|
--depths_;
|
||||||
*out_ = value(array_type, false);
|
*out_ = value(array_type, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
template <typename Iter> bool parse_array_item(input<Iter> &in, size_t) {
|
template <typename Iter> bool parse_array_item(input<Iter> &in, size_t) {
|
||||||
array &a = out_->get<array>();
|
array &a = out_->get<array>();
|
||||||
a.push_back(value());
|
a.push_back(value());
|
||||||
default_parse_context ctx(&a.back());
|
default_parse_context ctx(&a.back(), depths_);
|
||||||
return _parse(ctx, in);
|
return _parse(ctx, in);
|
||||||
}
|
}
|
||||||
bool parse_array_stop(size_t) {
|
bool parse_array_stop(size_t) {
|
||||||
|
++depths_;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool parse_object_start() {
|
bool parse_object_start() {
|
||||||
|
if (depths_ == 0)
|
||||||
|
return false;
|
||||||
*out_ = value(object_type, false);
|
*out_ = value(object_type, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
template <typename Iter> bool parse_object_item(input<Iter> &in, const std::string &key) {
|
template <typename Iter> bool parse_object_item(input<Iter> &in, const std::string &key) {
|
||||||
object &o = out_->get<object>();
|
object &o = out_->get<object>();
|
||||||
default_parse_context ctx(&o[key]);
|
default_parse_context ctx(&o[key], depths_);
|
||||||
return _parse(ctx, in);
|
return _parse(ctx, in);
|
||||||
}
|
}
|
||||||
|
bool parse_object_stop() {
|
||||||
|
++depths_;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
default_parse_context(const default_parse_context &);
|
default_parse_context(const default_parse_context &);
|
||||||
|
@ -1014,6 +1032,9 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
class null_parse_context {
|
class null_parse_context {
|
||||||
|
protected:
|
||||||
|
size_t depths_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
struct dummy_str {
|
struct dummy_str {
|
||||||
void push_back(int) {
|
void push_back(int) {
|
||||||
|
@ -1021,7 +1042,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
null_parse_context() {
|
null_parse_context(size_t depths = DEFAULT_MAX_DEPTHS) : depths_(depths) {
|
||||||
}
|
}
|
||||||
bool set_null() {
|
bool set_null() {
|
||||||
return true;
|
return true;
|
||||||
|
@ -1042,20 +1063,31 @@ public:
|
||||||
return _parse_string(s, in);
|
return _parse_string(s, in);
|
||||||
}
|
}
|
||||||
bool parse_array_start() {
|
bool parse_array_start() {
|
||||||
|
if (depths_ == 0)
|
||||||
|
return false;
|
||||||
|
--depths_;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
template <typename Iter> bool parse_array_item(input<Iter> &in, size_t) {
|
template <typename Iter> bool parse_array_item(input<Iter> &in, size_t) {
|
||||||
return _parse(*this, in);
|
return _parse(*this, in);
|
||||||
}
|
}
|
||||||
bool parse_array_stop(size_t) {
|
bool parse_array_stop(size_t) {
|
||||||
|
++depths_;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
bool parse_object_start() {
|
bool parse_object_start() {
|
||||||
|
if (depths_ == 0)
|
||||||
|
return false;
|
||||||
|
--depths_;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
template <typename Iter> bool parse_object_item(input<Iter> &in, const std::string &) {
|
template <typename Iter> bool parse_object_item(input<Iter> &in, const std::string &) {
|
||||||
|
++depths_;
|
||||||
return _parse(*this, in);
|
return _parse(*this, in);
|
||||||
}
|
}
|
||||||
|
bool parse_object_stop() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
null_parse_context(const null_parse_context &);
|
null_parse_context(const null_parse_context &);
|
|
@ -1,28 +0,0 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio 14
|
|
||||||
VisualStudioVersion = 14.0.25420.1
|
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jwt-cpp", "jwt-cpp.vcxproj", "{1CA8C676-7F8E-434C-9069-8F20A562E6E9}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|x64 = Debug|x64
|
|
||||||
Debug|x86 = Debug|x86
|
|
||||||
Release|x64 = Release|x64
|
|
||||||
Release|x86 = Release|x86
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Debug|x86.ActiveCfg = Debug|Win32
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Debug|x86.Build.0 = Debug|Win32
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Release|x64.ActiveCfg = Release|x64
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Release|x64.Build.0 = Release|x64
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Release|x86.ActiveCfg = Release|Win32
|
|
||||||
{1CA8C676-7F8E-434C-9069-8F20A562E6E9}.Release|x86.Build.0 = Release|Win32
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
|
@ -1,160 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>Win32</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Debug|x64">
|
|
||||||
<Configuration>Debug</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
<ProjectConfiguration Include="Release|x64">
|
|
||||||
<Configuration>Release</Configuration>
|
|
||||||
<Platform>x64</Platform>
|
|
||||||
</ProjectConfiguration>
|
|
||||||
</ItemGroup>
|
|
||||||
<PropertyGroup Label="Globals">
|
|
||||||
<ProjectGuid>{1CA8C676-7F8E-434C-9069-8F20A562E6E9}</ProjectGuid>
|
|
||||||
<Keyword>Win32Proj</Keyword>
|
|
||||||
<RootNamespace>jwtcpp</RootNamespace>
|
|
||||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
|
||||||
<PlatformToolset>v140</PlatformToolset>
|
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
|
||||||
<ImportGroup Label="ExtensionSettings">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="Shared">
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
|
||||||
</ImportGroup>
|
|
||||||
<PropertyGroup Label="UserMacros" />
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<LinkIncremental>true</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<LinkIncremental>false</LinkIncremental>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>gtest.lib;gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<Optimization>Disabled</Optimization>
|
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>gtest.lib;gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>gtest.lib;gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
|
||||||
<ClCompile>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
|
||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
</ClCompile>
|
|
||||||
<Link>
|
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<AdditionalDependencies>gtest.lib;gtest_main.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="include\jwt-cpp\base.h" />
|
|
||||||
<ClInclude Include="include\jwt-cpp\jwt.h" />
|
|
||||||
<ClInclude Include="include\jwt-cpp\picojson.h" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="BaseTest.cpp" />
|
|
||||||
<ClCompile Include="TokenTest.cpp" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
|
||||||
<ImportGroup Label="ExtensionTargets">
|
|
||||||
</ImportGroup>
|
|
||||||
</Project>
|
|
|
@ -1,36 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<ItemGroup>
|
|
||||||
<Filter Include="Quelldateien">
|
|
||||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
|
||||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Headerdateien">
|
|
||||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
|
||||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Ressourcendateien">
|
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
|
||||||
</Filter>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClInclude Include="include\jwt-cpp\jwt.h">
|
|
||||||
<Filter>Headerdateien</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="include\jwt-cpp\picojson.h">
|
|
||||||
<Filter>Headerdateien</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="include\jwt-cpp\base.h">
|
|
||||||
<Filter>Headerdateien</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ClCompile Include="BaseTest.cpp">
|
|
||||||
<Filter>Quelldateien</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="TokenTest.cpp">
|
|
||||||
<Filter>Quelldateien</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
|
@ -1,3 +0,0 @@
|
||||||
Source: jwt-cpp
|
|
||||||
Version: 2019-04-20
|
|
||||||
Description: A header only library for creating and validating json web tokens in c++
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff --git a/include/jwt-cpp/jwt.h b/include/jwt-cpp/jwt.h
|
|
||||||
index ec56810..a26fd97 100644
|
|
||||||
--- a/include/jwt-cpp/jwt.h
|
|
||||||
+++ b/include/jwt-cpp/jwt.h
|
|
||||||
@@ -1,6 +1,6 @@
|
|
||||||
#pragma once
|
|
||||||
#define PICOJSON_USE_INT64
|
|
||||||
-#include "picojson.h"
|
|
||||||
+#include "picojson/picojson.h"
|
|
||||||
#include "base.h"
|
|
||||||
#include <set>
|
|
||||||
#include <chrono>
|
|
|
@ -1,31 +0,0 @@
|
||||||
diff --git a/include/jwt-cpp/base.h b/include/jwt-cpp/base.h
|
|
||||||
index dfca7fc..4d05c0b 100644
|
|
||||||
--- a/include/jwt-cpp/base.h
|
|
||||||
+++ b/include/jwt-cpp/base.h
|
|
||||||
@@ -2,6 +2,10 @@
|
|
||||||
#include <string>
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
+#ifdef _MSC_VER
|
|
||||||
+#pragma warning(disable : 4267)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
namespace jwt {
|
|
||||||
namespace alphabet {
|
|
||||||
struct base64 {
|
|
||||||
diff --git a/include/jwt-cpp/jwt.h b/include/jwt-cpp/jwt.h
|
|
||||||
index ec56810..313cef2 100644
|
|
||||||
--- a/include/jwt-cpp/jwt.h
|
|
||||||
+++ b/include/jwt-cpp/jwt.h
|
|
||||||
@@ -12,6 +12,11 @@
|
|
||||||
#include <openssl/ec.h>
|
|
||||||
#include <openssl/err.h>
|
|
||||||
|
|
||||||
+#ifdef _MSC_VER
|
|
||||||
+#pragma warning(disable : 4267)
|
|
||||||
+#pragma warning(disable : 4067)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
//If openssl version less than 1.1
|
|
||||||
#if OPENSSL_VERSION_NUMBER < 269484032
|
|
||||||
#define OPENSSL10
|
|
|
@ -1,23 +0,0 @@
|
||||||
#header-only library
|
|
||||||
include(vcpkg_common_functions)
|
|
||||||
|
|
||||||
set(SOURCE_PATH ${CURRENT_BUILDTREES_DIR}/src/jwt-cpp)
|
|
||||||
|
|
||||||
vcpkg_from_github(OUT_SOURCE_PATH SOURCE_PATH
|
|
||||||
REPO Thalhammer/jwt-cpp
|
|
||||||
REF f0e37a79f605312686065405dd720fc197cc3df0
|
|
||||||
SHA512 ae83c205dbb340dedc58d0d3f0e2453c4edcf5ce43b401f49d02692dc8a2a4b7260f1ced05ddfa7c1d5d6f92446e232629ddbdf67a58a119b50c5c8163591598
|
|
||||||
HEAD_REF master
|
|
||||||
PATCHES fix-picojson.patch
|
|
||||||
fix-warning.patch)
|
|
||||||
|
|
||||||
# Copy the constexpr header files
|
|
||||||
file(GLOB HEADER_FILES ${SOURCE_PATH}/include/jwt-cpp/*)
|
|
||||||
file(COPY ${HEADER_FILES}
|
|
||||||
DESTINATION ${CURRENT_PACKAGES_DIR}/include/jwt-cpp
|
|
||||||
REGEX "\.(gitattributes|gitignore|picojson.h)$" EXCLUDE)
|
|
||||||
|
|
||||||
# Put the licence file where vcpkg expects it
|
|
||||||
file(COPY ${SOURCE_PATH}/LICENSE
|
|
||||||
DESTINATION ${CURRENT_PACKAGES_DIR}/share/jwt-cpp)
|
|
||||||
file(RENAME ${CURRENT_PACKAGES_DIR}/share/jwt-cpp/LICENSE ${CURRENT_PACKAGES_DIR}/share/jwt-cpp/copyright)
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
add_library(span-lite INTERFACE)
|
||||||
|
add_library(martinmoene::span-lite ALIAS span-lite)
|
||||||
|
|
||||||
|
target_include_directories(span-lite INTERFACE
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/include)
|
|
@ -0,0 +1,23 @@
|
||||||
|
Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
do so, all subject to the following:
|
||||||
|
|
||||||
|
The copyright notices in the Software and this entire statement, including
|
||||||
|
the above license grant, this restriction and the following disclaimer,
|
||||||
|
must be included in all copies of the Software, in whole or in part, and
|
||||||
|
all derivative works of the Software, unless such copies or derivative
|
||||||
|
works are solely in the form of machine-executable object code generated by
|
||||||
|
a source language processor.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,514 @@
|
||||||
|
<a id="top"></a>
|
||||||
|
# span lite: A single-file header-only version of a C++20-like span for C++98, C++11 and later
|
||||||
|
|
||||||
|
[![Language](https://img.shields.io/badge/C%2B%2B-98/11/14/17/20-blue.svg)](https://en.wikipedia.org/wiki/C%2B%2B#Standardization) [![License](https://img.shields.io/badge/license-BSL-blue.svg)](https://opensource.org/licenses/BSL-1.0) [![Build Status](https://travis-ci.org/martinmoene/span-lite.svg?branch=master)](https://travis-ci.org/martinmoene/span-lite) [![Build status](https://ci.appveyor.com/api/projects/status/1ha3wnxtam547m8p?svg=true)](https://ci.appveyor.com/project/martinmoene/span-lite) [![Version](https://badge.fury.io/gh/martinmoene%2Fspan-lite.svg)](https://github.com/martinmoene/span-lite/releases) [![download](https://img.shields.io/badge/latest-download-blue.svg)](https://github.com/martinmoene/span-lite/blob/master/include/nonstd/span.hpp) [![Conan](https://img.shields.io/badge/on-conan-blue.svg)](https://conan.io/center/span-lite) [![Try it on wandbox](https://img.shields.io/badge/on-wandbox-blue.svg)](https://wandbox.org/permlink/venR3Ko2Q4tlvcVk) [![Try it on godbolt online](https://img.shields.io/badge/on-godbolt-blue.svg)](https://godbolt.org/z/htwpnb)
|
||||||
|
|
||||||
|
**Contents**
|
||||||
|
|
||||||
|
- [Example usage](#example-usage)
|
||||||
|
- [In a nutshell](#in-a-nutshell)
|
||||||
|
- [License](#license)
|
||||||
|
- [Dependencies](#dependencies)
|
||||||
|
- [Installation and use](#installation-and-use)
|
||||||
|
- [Synopsis](#synopsis)
|
||||||
|
- [Reported to work with](#reported-to-work-with)
|
||||||
|
- [Building the tests](#building-the-tests)
|
||||||
|
- [Other implementations of span](#other-implementations-of-span)
|
||||||
|
- [Notes and references](#notes-and-references)
|
||||||
|
- [Appendix](#appendix)
|
||||||
|
|
||||||
|
## Example usage
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "nonstd/span.hpp"
|
||||||
|
#include <array>
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
std::ptrdiff_t size( nonstd::span<const int> spn )
|
||||||
|
{
|
||||||
|
return spn.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int arr[] = { 1, };
|
||||||
|
|
||||||
|
std::cout <<
|
||||||
|
"C-array:" << size( arr ) <<
|
||||||
|
" array:" << size( std::array <int, 2>{ 1, 2, } ) <<
|
||||||
|
" vector:" << size( std::vector<int >{ 1, 2, 3, } );
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Compile and run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
prompt> g++ -std=c++11 -Wall -I../include -o 01-basic.exe 01-basic.cpp && 01-basic.exe
|
||||||
|
C-array:1 array:2 vector:3
|
||||||
|
```
|
||||||
|
|
||||||
|
## In a nutshell
|
||||||
|
|
||||||
|
**span lite** is a single-file header-only library to provide a bounds-safe view for sequences of objects. The library provides a [C++20-like span](http://en.cppreference.com/w/cpp/container/span) for use with C++98 and later. If available, `std::span` is used, unless [configured otherwise](#configuration). *span-lite* can detect the presence of [*byte-lite*](https://github.com/martinmoene/byte-lite) and if present, it provides `as_bytes()` and `as_writable_bytes()` also for C++14 and earlier.
|
||||||
|
|
||||||
|
**Features and properties of span lite** are ease of installation (single header), freedom of dependencies other than the standard library. To compensate for the class template argument deduction that is missing from pre-C++17 compilers, `nonstd::span` can provide `make_span` functions. See [configuration](#configuration).
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
*span lite* is distributed under the [Boost Software License](https://github.com/martinmoene/span-lite/blob/master/LICENSE.txt).
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
*span lite* has no other dependencies than the [C++ standard library](http://en.cppreference.com/w/cpp/header).
|
||||||
|
|
||||||
|
## Installation and use
|
||||||
|
|
||||||
|
*span lite* is a single-file header-only library. Put `span.hpp` in the [include](include) folder directly into the project source tree or somewhere reachable from your project.
|
||||||
|
|
||||||
|
## Synopsis
|
||||||
|
|
||||||
|
**Contents**
|
||||||
|
[Documentation of `std::span`](#documentation-of-stdspan)
|
||||||
|
[Later additions](#later-additions)
|
||||||
|
[Non-standard extensions](#non-standard-extensions)
|
||||||
|
[Configuration](#configuration)
|
||||||
|
|
||||||
|
## Documentation of `std::span`
|
||||||
|
|
||||||
|
Depending on the compiler and C++-standard used, `nonstd::span` behaves less or more like `std::span`. To get an idea of the capabilities of `nonstd::span` with your configuration, look at the output of the [tests](test/span.t.cpp), issuing `span-main.t --pass @`. For `std::span`, see its [documentation at cppreference](http://en.cppreference.com/w/cpp/container/span).
|
||||||
|
|
||||||
|
## Later additions
|
||||||
|
|
||||||
|
### `back()` and `front()`
|
||||||
|
|
||||||
|
*span lite* can provide `back()` and `front()` member functions for element access. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
## Non-standard extensions
|
||||||
|
|
||||||
|
### Construct from container
|
||||||
|
|
||||||
|
To construct a span from a container with compilers that cannot constrain such a single-parameter constructor to containers, *span lite* provides a constructor that takes an additional parameter of type `with_container_t`. Use `with_container` as value for this parameter. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
### Construct from `std::array` with const data
|
||||||
|
|
||||||
|
*span lite* can provide construction of a span from a `std::array` with const data. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
### `operator()`
|
||||||
|
|
||||||
|
*span lite* can provide member function call `operator()` for element access. It is equivalent to `operator[]` and has been marked `[[deprecated]]`. Its main purpose is to provide a migration path.
|
||||||
|
|
||||||
|
### `at()`
|
||||||
|
|
||||||
|
*span lite* can provide member function `at()` for element access. Unless exceptions have been disabled, `at()` throws std::out_of_range if the index falls outside the span. With exceptions disabled, `at(index_t)` delegates bounds checking to `operator[](index_t)`. See the table below and sections [configuration](#configuration) and [disable exceptions](#disable-exceptions).
|
||||||
|
|
||||||
|
### `swap()`
|
||||||
|
|
||||||
|
*span lite* can provide a `swap()`member function. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
### `operator==()` and other comparison functions
|
||||||
|
|
||||||
|
*span lite* can provide functions to compare the content of two spans. However, C++20's span will not provide comparison and _span lite_ will omit comparison at default in the near future. See the table below and section [configuration](#configuration). See also [Revisiting Regular Types](#regtyp).
|
||||||
|
|
||||||
|
### `same()`
|
||||||
|
|
||||||
|
*span lite* can provide function `same()` to determine if two spans refer as identical spans to the same data via the same type. If `same()` is enabled, `operator==()` incorporates it in its comparison. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
### `first()`, `last()` and `subspan()`
|
||||||
|
|
||||||
|
*span lite* can provide functions `first()`, `last()` and `subspan()` to avoid having to use the *dot template* syntax when the span is a dependent type. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
### `make_span()`
|
||||||
|
|
||||||
|
*span lite* can provide `make_span()` creator functions to compensate for the class template argument deduction that is missing from pre-C++17 compilers. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
### `byte_span()`
|
||||||
|
|
||||||
|
*span lite* can provide `byte_span()` creator functions to represent an object as a span of bytes. This requires the C++17 type `std::byte` to be available. See the table below and section [configuration](#configuration).
|
||||||
|
|
||||||
|
| Kind | std | Function or method |
|
||||||
|
|--------------------|------|--------------------|
|
||||||
|
| **Macro** | | macro **`span_FEATURE_WITH_CONTAINER`**<br>macro **`span_FEATURE_WITH_CONTAINER_TO_STD`** |
|
||||||
|
| **Types** | | **with_container_t** type to disambiguate below constructors |
|
||||||
|
| **Objects** | | **with_container** value to disambiguate below constructors |
|
||||||
|
| **Constructors** | | macro **`span_FEATURE_CONSTRUCTION_FROM_STDARRAY_ELEMENT_TYPE`**|
|
||||||
|
| | | template<class Container><br>constexpr **span**(with_container_t, Container & cont) |
|
||||||
|
| | | template<class Container><br>constexpr **span**(with_container_t, Container const & cont) |
|
||||||
|
| | | |
|
||||||
|
| **Methods** | | macro **`span_FEATURE_MEMBER_CALL_OPERATOR`** |
|
||||||
|
| | | constexpr reference **operator()**(index_t idx) const<br>Equivalent to **operator[]**(), marked `[[deprecated]]` |
|
||||||
|
| | | |
|
||||||
|
| **Methods** | | macro **`span_FEATURE_MEMBER_AT`** |
|
||||||
|
| | | constexpr reference **at**(index_t idx) const<br>May throw std::out_of_range exception |
|
||||||
|
| | | |
|
||||||
|
| **Methods** | | macro **`span_FEATURE_MEMBER_BACK_FRONT`** (on since v0.5.0) |
|
||||||
|
| | | constexpr reference **back()** const noexcept |
|
||||||
|
| | | constexpr reference **front()** const noexcept |
|
||||||
|
| | | |
|
||||||
|
| **Method** | | macro **`span_FEATURE_MEMBER_SWAP`** |
|
||||||
|
| | | constexpr void **swap**(span & other) noexcept |
|
||||||
|
| | | |
|
||||||
|
| **Free functions** | | macro **`span_FEATURE_COMPARISON`** |
|
||||||
|
|<br><br>== != < > <= >= | | template<class T1, index_t E1, class T2, index_t E2><br>constexpr bool<br>**operator==**( span<T1,E1> const & l, span<T2,E2> const & r) noexcept |
|
||||||
|
| | | |
|
||||||
|
| **Free function** | | macro **`span_FEATURE_SAME`** |
|
||||||
|
| | | template<class T1, index_t E1, class T2, index_t E2><br>constexpr bool<br>**same**( span<T1,E1> const & l, span<T2,E2> const & r) noexcept |
|
||||||
|
| | | |
|
||||||
|
| **Free functions** | | macro **`span_FEATURE_NON_MEMBER_FIRST_LAST_SUB`** |
|
||||||
|
| | >= C++11 | template<extent_t Count, class T><br>constexpr auto<br>**first**(T & t) ->... |
|
||||||
|
| | >= C++11 | template<class T><br>constexpr auto<br>**first**(T & t, index_t count) ->... |
|
||||||
|
| | >= C++11 | template<extent_t Count, class T><br>constexpr auto<br>**last**(T & t) ->... |
|
||||||
|
| | >= C++11 | template<class T><br>constexpr auto<br>**last**(T & t, extent_t count) ->... |
|
||||||
|
| | >= C++11 | template<index_t Offset, extent_t Count = dynamic_extent, class T><br>constexpr auto<br>**subspan**(T & t) ->... |
|
||||||
|
| | >= C++11 | template<class T><br>constexpr auto<br>**subspan**(T & t, index_t offset, extent_t count = dynamic_extent) ->... |
|
||||||
|
| | | |
|
||||||
|
| **Free functions** | | macro **`span_FEATURE_MAKE_SPAN`**<br>macro **`span_FEATURE_MAKE_SPAN_TO_STD`** |
|
||||||
|
| | | template<class T><br>constexpr span<T><br>**make_span**(T \* first, T \* last) noexcept |
|
||||||
|
| | | template<class T><br>constexpr span<T><br>**make_span**(T \* ptr, index_t count) noexcept |
|
||||||
|
| | | template<class T, size_t N><br>constexpr span<T,N><br>**make_span**(T (&arr)[N]) noexcept |
|
||||||
|
| | >= C++11 | template<class T, size_t N><br>constexpr span<T,N><br>**make_span**(std::array<T,N> & arr) noexcept |
|
||||||
|
| | >= C++11 | template<class T, size_t N><br>constexpr span<const T,N><br>**make_span**(std::array<T,N > const & arr) noexcept |
|
||||||
|
| | >= C++11 | template<class Container><br>constexpr auto<br>**make_span**(Container & cont) -><br> span<typename Container::value_type> noexcept |
|
||||||
|
| | >= C++11 | template<class Container><br>constexpr auto<br>**make_span**(Container const & cont) -><br> span<const typename Container::value_type> noexcept |
|
||||||
|
| | | template<class Container><br>span<typename Container::value_type><br>**make_span**( with_container_t, Container & cont ) |
|
||||||
|
| | | template<class Container><br>span<const typename Container::value_type><br>**make_span**( with_container_t, Container const & cont ) |
|
||||||
|
| | < C++11 | template<class T, Allocator><br>span<T><br>**make_span**(std::vector<T, Allocator> & cont) |
|
||||||
|
| | < C++11 | template<class T, Allocator><br>span<const T><br>**make_span**(std::vector<T, Allocator> const & cont) |
|
||||||
|
| | | |
|
||||||
|
| **Free functions** | | macro **`span_FEATURE_BYTE_SPAN`** |
|
||||||
|
| | >= C++11 | template<class T><br>span<T, sizeof(T)><br>**byte_span**(T & t) |
|
||||||
|
| | >= C++11 | template<class T><br>span<const T, sizeof(T)><br>**byte_span**(T const & t) |
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Tweak header
|
||||||
|
|
||||||
|
If the compiler supports [`__has_include()`](https://en.cppreference.com/w/cpp/preprocessor/include), *span lite* supports the [tweak header](https://vector-of-bool.github.io/2020/10/04/lib-configuration.html) mechanism. Provide your *tweak header* as `nonstd/span.tweak.hpp` in a folder in the include-search-path. In the tweak header, provide definitions as documented below, like `#define span_CONFIG_NO_EXCEPTIONS 1`.
|
||||||
|
|
||||||
|
### Standard selection macro
|
||||||
|
|
||||||
|
\-D<b>span\_CPLUSPLUS</b>=199711L
|
||||||
|
Define this macro to override the auto-detection of the supported C++ standard, if your compiler does not set the `__cplusplus` macro correctly.
|
||||||
|
|
||||||
|
### Select `std::span` or `nonstd::span`
|
||||||
|
|
||||||
|
At default, *span lite* uses `std::span` if it is available and lets you use it via namespace `nonstd`. You can however override this default and explicitly request to use `std::span` or span lite's `nonstd::span` as `nonstd::span` via the following macros.
|
||||||
|
|
||||||
|
-D<b>span\_CONFIG\_SELECT\_SPAN</b>=span_SPAN_DEFAULT
|
||||||
|
Define this to `span_SPAN_STD` to select `std::span` as `nonstd::span`. Define this to `span_SPAN_NONSTD` to select `nonstd::span` as `nonstd::span`. Default is undefined, which has the same effect as defining to `span_SPAN_DEFAULT`.
|
||||||
|
|
||||||
|
### Select extent type
|
||||||
|
|
||||||
|
-D<b>span_CONFIG_EXTENT_TYPE</b>=std::size_t
|
||||||
|
Define this to `std::ptrdiff_t` to use the signed type. The default is `std::size_t`, as in C++20 (since v0.7.0).
|
||||||
|
|
||||||
|
### Select size type
|
||||||
|
|
||||||
|
-D<b>span_CONFIG_SIZE_TYPE</b>=std::size_t
|
||||||
|
Define this to `std::ptrdiff_t` to use the signed type. The default is `std::size_t`, as in C++20 (since v0.7.0). Note `span_CONFIG_SIZE_TYPE` replaces `span_CONFIG_INDEX_TYPE` which is deprecated.
|
||||||
|
|
||||||
|
### Disable exceptions
|
||||||
|
|
||||||
|
-D<b>span_CONFIG_NO_EXCEPTIONS</b>=0
|
||||||
|
Define this to 1 if you want to compile without exceptions. If not defined, the header tries and detect if exceptions have been disabled (e.g. via `-fno-exceptions`). Disabling exceptions will force contract violation to use termination, see [contract violation macros](#contract-violation-response-macros). Default is undefined.
|
||||||
|
|
||||||
|
### Provide construction using `with_container_t`
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_WITH_CONTAINER</b>=0
|
||||||
|
Define this to 1 to enable constructing a span using `with_container_t`. Note that `span_FEATURE_WITH_CONTAINER` takes precedence over `span_FEATURE_WITH_CONTAINER_TO_STD`. Default is undefined.
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_WITH_CONTAINER_TO_STD</b>=*n*
|
||||||
|
Define this to the highest C++ language version for which to enable constructing a span using `with_container_t`, like 98, 03, 11, 14, 17, 20. You can use 99 for inclusion with any standard, but prefer to use `span_FEATURE_WITH_CONTAINER` for this. Note that `span_FEATURE_WITH_CONTAINER` takes precedence over `span_FEATURE_WITH_CONTAINER_TO_STD`. Default is undefined.
|
||||||
|
|
||||||
|
### Provide construction from `std::array` with const data
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_CONSTRUCTION_FROM_STDARRAY_ELEMENT_TYPE</b>=0
|
||||||
|
Define this to 1 to enable constructing a span from a std::array with const data. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `operator()` member function
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_MEMBER_CALL_OPERATOR</b>=0
|
||||||
|
Define this to 1 to provide member function `operator()`for element access. It is equivalent to `operator[]` and has been marked `[[deprecated]]`. Its main purpose is to provide a migration path. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `at()` member function
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_MEMBER_AT</b>=0
|
||||||
|
Define this to 1 to provide member function `at()`. Define this to 2 to include index and size in message of std::out_of_range exception. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `back()` and `front()` member functions
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_MEMBER_BACK_FRONT</b>=1 _(on since v0.5.0)_
|
||||||
|
Define this to 0 to omit member functions `back()` and `front()`. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `swap()` member function
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_MEMBER_SWAP</b>=0
|
||||||
|
Define this to 1 to provide member function `swap()`. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `operator==()` and other comparison functions
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_COMPARISON</b>=0
|
||||||
|
Define this to 1 to include the comparison functions to compare the content of two spans. C++20's span does not provide comparison and _span lite_ omits comparison from v0.7.0. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `same()` function
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_SAME</b>=0
|
||||||
|
Define this to 1 to provide function `same()` to test if two spans refer as identical spans to the same data via the same type. If `same()` is enabled, `operator==()` incorporates it in its comparison. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `first()`, `last()` and `subspan()` functions
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_NON_MEMBER_FIRST_LAST_SUB</b>=0
|
||||||
|
Define this to 1 to provide functions `first()`, `last()` and `subspan()`. This implies `span_FEATURE_MAKE_SPAN` to provide functions `make_span()` that are required for this feature. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `make_span()` functions
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_MAKE_SPAN</b>=0
|
||||||
|
Define this to 1 to provide creator functions `nonstd::make_span()`. This feature is implied by using `span_FEATURE_NON_MEMBER_FIRST_LAST_SUB=1`. Note that `span_FEATURE_MAKE_SPAN` takes precedence over `span_FEATURE_MAKE_SPAN_TO_STD`. Default is undefined.
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_MAKE_SPAN_TO_STD</b>=*n*
|
||||||
|
Define this to the highest C++ language version for which to provide creator functions `nonstd::make_span()`, like 98, 03, 11, 14, 17, 20. You can use 99 for inclusion with any standard, but prefer to use `span_FEATURE_MAKE_SPAN` for this. Note that `span_FEATURE_MAKE_SPAN` takes precedence over `span_FEATURE_MAKE_SPAN_TO_STD`. Default is undefined.
|
||||||
|
|
||||||
|
### Provide `byte_span()` functions
|
||||||
|
|
||||||
|
-D<b>span_FEATURE_BYTE_SPAN</b>=0
|
||||||
|
Define this to 1 to provide creator functions `nonstd::byte_span()`. Default is undefined.
|
||||||
|
|
||||||
|
### Contract violation response macros
|
||||||
|
|
||||||
|
*span-lite* provides contract violation response control as suggested in proposal [N4415](http://wg21.link/n4415).
|
||||||
|
|
||||||
|
\-D<b>span\_CONFIG\_CONTRACT\_LEVEL\_ON</b> (*default*)
|
||||||
|
Define this macro to include both `span_EXPECTS` and `span_ENSURES` in the code. This is the default case.
|
||||||
|
|
||||||
|
\-D<b>span\_CONFIG\_CONTRACT\_LEVEL\_OFF</b>
|
||||||
|
Define this macro to exclude both `span_EXPECTS` and `span_ENSURES` from the code.
|
||||||
|
|
||||||
|
\-D<b>span\_CONFIG_CONTRACT\_LEVEL\_EXPECTS\_ONLY</b>
|
||||||
|
Define this macro to include `span_EXPECTS` in the code and exclude `span_ENSURES` from the code.
|
||||||
|
|
||||||
|
\-D<b>span\_CONFIG\_CONTRACT\_LEVEL\_ENSURES\_ONLY</b>
|
||||||
|
Define this macro to exclude `span_EXPECTS` from the code and include `span_ENSURES` in the code.
|
||||||
|
|
||||||
|
\-D<b>span\_CONFIG\_CONTRACT\_VIOLATION\_TERMINATES</b> (*default*)
|
||||||
|
Define this macro to call `std::terminate()` on a contract violation in `span_EXPECTS`, `span_ENSURES`. This is the default case.
|
||||||
|
|
||||||
|
\-D<b>span\_CONFIG\_CONTRACT\_VIOLATION\_THROWS</b>
|
||||||
|
Define this macro to throw an exception of implementation-defined type that is derived from `std::runtime_exception` instead of calling `std::terminate()` on a contract violation in `span_EXPECTS` and `span_ENSURES`. See also [disable exceptions](#disable-exceptions).
|
||||||
|
|
||||||
|
Reported to work with
|
||||||
|
--------------------
|
||||||
|
The table below mentions the compiler versions *span lite* is reported to work with.
|
||||||
|
|
||||||
|
OS | Compiler | Where | Versions |
|
||||||
|
------------:|:-----------|:--------|:---------|
|
||||||
|
**GNU/Linux**| Clang/LLVM | Travis | 3.5.0, 3.6.2, 3.7.1, 3.8.0, 3.9.1, 4.0.1 |
|
||||||
|
| GCC | Travis | 5.5.0, 6.4.0, 7.3.0 |
|
||||||
|
**OS X** | ? | Local | ? |
|
||||||
|
**Windows** | Clang/LLVM | Local | 6.0.0 |
|
||||||
|
| GCC | Local | 7.2.0 |
|
||||||
|
| Visual C++<br>(Visual Studio)| Local | 8 (2005), 10 (2010), 11 (2012),<br>12 (2013), 14 (2015), 15 (2017) |
|
||||||
|
| Visual C++<br>(Visual Studio)| AppVeyor | 10 (2010), 11 (2012),<br>12 (2013), 14 (2015), 15 (2017) |
|
||||||
|
|
||||||
|
## Building the tests
|
||||||
|
|
||||||
|
To build the tests you need:
|
||||||
|
|
||||||
|
- [CMake](http://cmake.org), version 3.0 or later to be installed and in your PATH.
|
||||||
|
- A [suitable compiler](#reported-to-work-with).
|
||||||
|
|
||||||
|
The [*lest* test framework](https://github.com/martinmoene/lest) is included in the [test folder](test).
|
||||||
|
|
||||||
|
The following steps assume that the [*span lite* source code](https://github.com/martinmoene/span-lite) has been cloned into a directory named `./span-lite`.
|
||||||
|
|
||||||
|
1. Create a directory for the build outputs.
|
||||||
|
|
||||||
|
cd ./span-lite
|
||||||
|
md build && cd build
|
||||||
|
|
||||||
|
2. Configure CMake to use the compiler of your choice (run `cmake --help` for a list).
|
||||||
|
|
||||||
|
cmake -G "Unix Makefiles" -DSPAN_LITE_OPT_BUILD_TESTS=ON ..
|
||||||
|
|
||||||
|
3. Optional. You can control above configuration through the following options:
|
||||||
|
|
||||||
|
`-DSPAN_LITE_OPT_BUILD_TESTS=ON`: build the tests for span, default off
|
||||||
|
`-DSPAN_LITE_OPT_BUILD_EXAMPLES=OFF`: build the examples, default off
|
||||||
|
|
||||||
|
4. Build the test suite.
|
||||||
|
|
||||||
|
cmake --build .
|
||||||
|
|
||||||
|
5. Run the test suite.
|
||||||
|
|
||||||
|
ctest -V
|
||||||
|
|
||||||
|
All tests should pass, indicating your platform is supported and you are ready to use *span lite*.
|
||||||
|
|
||||||
|
## Other implementations of span
|
||||||
|
|
||||||
|
- *gsl-lite* [span](https://github.com/martinmoene/gsl-lite/blob/73c4f16f2b35fc174fc2f09d44d5ab13e5c638c3/include/gsl/gsl-lite.hpp#L1221).
|
||||||
|
- Microsoft GSL [span](https://github.com/Microsoft/GSL/blob/master/include/gsl/span).
|
||||||
|
- Google Abseil [span](https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h).
|
||||||
|
- Marshall Clow's [libc++ span snippet](https://github.com/mclow/snippets/blob/master/span.cpp).
|
||||||
|
- Tristan Brindle's [Implementation of C++20's std::span for older compilers](https://github.com/tcbrindle/span).
|
||||||
|
- [Search _span c++_ on GitHub](https://github.com/search?l=C%2B%2B&q=span+c%2B%2B&type=Repositories&utf8=%E2%9C%93).
|
||||||
|
|
||||||
|
## Notes and references
|
||||||
|
|
||||||
|
*Interface and specification*
|
||||||
|
|
||||||
|
- [span on cppreference](https://en.cppreference.com/w/cpp/container/span).
|
||||||
|
- [p0122 - C++20 Proposal](http://wg21.link/p0122).
|
||||||
|
- [span in C++20 Working Draft](http://eel.is/c++draft/views).
|
||||||
|
|
||||||
|
*Presentations*
|
||||||
|
|
||||||
|
- TBD
|
||||||
|
|
||||||
|
*Proposals*
|
||||||
|
|
||||||
|
- [p0122 - span: bounds-safe views for sequences of objects](http://wg21.link/p0122).
|
||||||
|
- [p1024 - Usability Enhancements for std::span](http://wg21.link/p1024).
|
||||||
|
- [p1419 - A SFINAE-friendly trait to determine the extent of statically sized containers](http://wg21.link/p1419).
|
||||||
|
- [p0805 - Comparing Containers](http://wg21.link/p0805).
|
||||||
|
- [p1085 - Should Span be Regular?](http://wg21.link/p0805).
|
||||||
|
- [p0091 - Template argument deduction for class templates](http://wg21.link/p0091).
|
||||||
|
- [p0856 - Restrict Access Property for mdspan and span](http://wg21.link/p0856).
|
||||||
|
- [p1428 - Subscripts and sizes should be signed](http://wg21.link/p1428).
|
||||||
|
- [p1089 - Sizes Should Only span Unsigned](http://wg21.link/p1089).
|
||||||
|
- [p1227 - Signed size() functions](http://wg21.link/p1227).
|
||||||
|
- [p1872 - span should have size_type, not index_type](http://wg21.link/p1872).
|
||||||
|
- [lwg 3101 - span's Container constructors need another constraint](https://cplusplus.github.io/LWG/issue3101).
|
||||||
|
- [Reddit - 2018-06 Rapperswil ISO C++ Committee Trip Report](https://www.reddit.com/r/cpp/comments/8prqzm/2018_rapperswil_iso_c_committee_trip_report/)
|
||||||
|
- [Reddit - 2018-11 San Diego ISO C++ Committee Trip Report](https://www.reddit.com/r/cpp/comments/9vwvbz/2018_san_diego_iso_c_committee_trip_report_ranges/).
|
||||||
|
- [Reddit - 2019-02 Kona ISO C++ Committee Trip Report](https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/).
|
||||||
|
- [Reddit - 2019-07 Cologne ISO C++ Committee Trip Report](https://www.reddit.com/r/cpp/comments/cfk9de/201907_cologne_iso_c_committee_trip_report_the/)
|
||||||
|
- [Reddit - 2019-11 Belfast ISO C++ Committee Trip Report](https://www.reddit.com/r/cpp/comments/dtuov8/201911_belfast_iso_c_committee_trip_report/)
|
||||||
|
- <a id="regtyp"></a>Titus Winters. [Revisiting Regular Types](https://abseil.io/blog/20180531-regular-types). Abseil Blog. 31 May 2018.
|
||||||
|
|
||||||
|
## Appendix
|
||||||
|
|
||||||
|
### A.1 Compile-time information
|
||||||
|
|
||||||
|
The version of *span lite* is available via tag `[.version]`. The following tags are available for information on the compiler and on the C++ standard library used: `[.compiler]`, `[.stdc++]`, `[.stdlanguage]` and `[.stdlibrary]`.
|
||||||
|
|
||||||
|
### A.2 Span lite test specification
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>click to expand</summary>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
```Text
|
||||||
|
span<>: Terminates construction from a nullptr and a non-zero size (C++11)
|
||||||
|
span<>: Terminates construction from two pointers in the wrong order
|
||||||
|
span<>: Terminates construction from a null pointer and a non-zero size
|
||||||
|
span<>: Terminates creation of a sub span of the first n elements for n exceeding the span
|
||||||
|
span<>: Terminates creation of a sub span of the last n elements for n exceeding the span
|
||||||
|
span<>: Terminates creation of a sub span outside the span
|
||||||
|
span<>: Terminates access outside the span
|
||||||
|
span<>: Throws on access outside the span via at(): std::out_of_range [span_FEATURE_MEMBER_AT>0][span_CONFIG_NO_EXCEPTIONS=0]
|
||||||
|
span<>: Termination throws std::logic_error-derived exception [span_CONFIG_CONTRACT_VIOLATION_THROWS=1]
|
||||||
|
span<>: Allows to default-construct
|
||||||
|
span<>: Allows to construct from a nullptr and a zero size (C++11)
|
||||||
|
span<>: Allows to construct from two pointers
|
||||||
|
span<>: Allows to construct from two iterators
|
||||||
|
span<>: Allows to construct from two iterators - empty range
|
||||||
|
span<>: Allows to construct from an iterator and a size
|
||||||
|
span<>: Allows to construct from an iterator and a size - empty range
|
||||||
|
span<>: Allows to construct from two pointers to const
|
||||||
|
span<>: Allows to construct from a non-null pointer and a size
|
||||||
|
span<>: Allows to construct from a non-null pointer to const and a size
|
||||||
|
span<>: Allows to construct from a temporary pointer and a size
|
||||||
|
span<>: Allows to construct from a temporary pointer to const and a size
|
||||||
|
span<>: Allows to construct from any pointer and a zero size (C++98)
|
||||||
|
span<>: Allows to construct from a pointer and a size via a deduction guide (C++17)
|
||||||
|
span<>: Allows to construct from an iterator and a size via a deduction guide (C++17)
|
||||||
|
span<>: Allows to construct from two iterators via a deduction guide (C++17)
|
||||||
|
span<>: Allows to construct from a C-array
|
||||||
|
span<>: Allows to construct from a C-array via a deduction guide (C++17)
|
||||||
|
span<>: Allows to construct from a const C-array
|
||||||
|
span<>: Allows to construct from a C-array with size via decay to pointer (potentially dangerous)
|
||||||
|
span<>: Allows to construct from a const C-array with size via decay to pointer (potentially dangerous)
|
||||||
|
span<>: Allows to construct from a std::initializer_list<> (C++11)
|
||||||
|
span<>: Allows to construct from a std::array<> (C++11)
|
||||||
|
span<>: Allows to construct from a std::array via a deduction guide (C++17)
|
||||||
|
span<>: Allows to construct from a std::array<> with const data (C++11, span_FEATURE_CONSTR..._ELEMENT_TYPE=1)
|
||||||
|
span<>: Allows to construct from an empty std::array<> (C++11)
|
||||||
|
span<>: Allows to construct from a container (std::vector<>)
|
||||||
|
span<>: Allows to construct from a container via a deduction guide (std::vector<>, C++17)
|
||||||
|
span<>: Allows to tag-construct from a container (std::vector<>)
|
||||||
|
span<>: Allows to tag-construct from a const container (std::vector<>)
|
||||||
|
span<>: Allows to copy-construct from another span of the same type
|
||||||
|
span<>: Allows to copy-construct from another span of a compatible type
|
||||||
|
span<>: Allows to copy-construct from a temporary span of the same type (C++11)
|
||||||
|
span<>: Allows to copy-assign from another span of the same type
|
||||||
|
span<>: Allows to copy-assign from a temporary span of the same type (C++11)
|
||||||
|
span<>: Allows to create a sub span of the first n elements
|
||||||
|
span<>: Allows to create a sub span of the last n elements
|
||||||
|
span<>: Allows to create a sub span starting at a given offset
|
||||||
|
span<>: Allows to create a sub span starting at a given offset with a given length
|
||||||
|
span<>: Allows to observe an element via array indexing
|
||||||
|
span<>: Allows to observe an element via call indexing
|
||||||
|
span<>: Allows to observe an element via at() [span_FEATURE_MEMBER_AT>0]
|
||||||
|
span<>: Allows to observe an element via data()
|
||||||
|
span<>: Allows to observe the first element via front() [span_FEATURE_MEMBER_BACK_FRONT=1]
|
||||||
|
span<>: Allows to observe the last element via back() [span_FEATURE_MEMBER_BACK_FRONT=1]
|
||||||
|
span<>: Allows to change an element via array indexing
|
||||||
|
span<>: Allows to change an element via call indexing
|
||||||
|
span<>: Allows to change an element via at() [span_FEATURE_MEMBER_AT>0]
|
||||||
|
span<>: Allows to change an element via data()
|
||||||
|
span<>: Allows to change the first element via front() [span_FEATURE_MEMBER_BACK_FRONT=1]
|
||||||
|
span<>: Allows to change the last element via back() [span_FEATURE_MEMBER_BACK_FRONT=1]
|
||||||
|
span<>: Allows to swap with another span [span_FEATURE_MEMBER_SWAP=1]
|
||||||
|
span<>: Allows forward iteration
|
||||||
|
span<>: Allows const forward iteration
|
||||||
|
span<>: Allows reverse iteration
|
||||||
|
span<>: Allows const reverse iteration
|
||||||
|
span<>: Allows to identify if a span is the same as another span [span_FEATURE_SAME=1]
|
||||||
|
span<>: Allows to compare equal to another span of the same type [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to compare unequal to another span of the same type [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to compare less than another span of the same type [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to compare less than or equal to another span of the same type [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to compare greater than another span of the same type [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to compare greater than or equal to another span of the same type [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to compare to another span of the same type and different cv-ness [span_FEATURE_SAME=0]
|
||||||
|
span<>: Allows to compare empty spans as equal [span_FEATURE_COMPARISON=1]
|
||||||
|
span<>: Allows to test for empty span via empty(), empty case
|
||||||
|
span<>: Allows to test for empty span via empty(), non-empty case
|
||||||
|
span<>: Allows to obtain the number of elements via size()
|
||||||
|
span<>: Allows to obtain the number of elements via ssize()
|
||||||
|
span<>: Allows to obtain the number of bytes via size_bytes()
|
||||||
|
span<>: Allows to view the elements as read-only bytes
|
||||||
|
span<>: Allows to view and change the elements as writable bytes
|
||||||
|
make_span() [span_FEATURE_MAKE_SPAN_TO_STD=99]
|
||||||
|
make_span(): Allows building from two pointers
|
||||||
|
make_span(): Allows building from two const pointers
|
||||||
|
make_span(): Allows building from a non-null pointer and a size
|
||||||
|
make_span(): Allows building from a non-null const pointer and a size
|
||||||
|
make_span(): Allows building from a C-array
|
||||||
|
make_span(): Allows building from a const C-array
|
||||||
|
make_span(): Allows building from a std::initializer_list<> (C++11)
|
||||||
|
make_span(): Allows building from a std::array<> (C++11)
|
||||||
|
make_span(): Allows building from a const std::array<> (C++11)
|
||||||
|
make_span(): Allows building from a container (std::vector<>)
|
||||||
|
make_span(): Allows building from a const container (std::vector<>)
|
||||||
|
make_span(): Allows building from a container (with_container_t, std::vector<>)
|
||||||
|
make_span(): Allows building from a const container (with_container_t, std::vector<>)
|
||||||
|
byte_span() [span_FEATURE_BYTE_SPAN=1]
|
||||||
|
byte_span(): Allows building a span of std::byte from a single object (C++17, byte-lite)
|
||||||
|
byte_span(): Allows building a span of const std::byte from a single const object (C++17, byte-lite)
|
||||||
|
first(), last(), subspan() [span_FEATURE_NON_MEMBER_FIRST_LAST_SUB=1]
|
||||||
|
first(): Allows to create a sub span of the first n elements
|
||||||
|
last(): Allows to create a sub span of the last n elements
|
||||||
|
subspan(): Allows to create a sub span starting at a given offset
|
||||||
|
size(): Allows to obtain the number of elements via size()
|
||||||
|
ssize(): Allows to obtain the number of elements via ssize()
|
||||||
|
tuple_size<>: Allows to obtain the number of elements via std::tuple_size<> (C++11)
|
||||||
|
tuple_element<>: Allows to obtain an element via std::tuple_element<> (C++11)
|
||||||
|
tuple_element<>: Allows to obtain an element via std::tuple_element_t<> (C++11)
|
||||||
|
get<I>(spn): Allows to access an element via std::get<>()
|
||||||
|
tweak header: reads tweak header if supported [tweak]
|
||||||
|
```
|
||||||
|
|
||||||
|
</p>
|
||||||
|
</details>
|
File diff suppressed because it is too large
Load Diff
|
@ -5,7 +5,6 @@ Maintainer: Isaac Connor <isaac@zoneminder.com>
|
||||||
Uploaders: Isaac Connor <isaac@zoneminder.com>
|
Uploaders: Isaac Connor <isaac@zoneminder.com>
|
||||||
Build-Depends: debhelper, sphinx-doc, dh-linktree, dh-apache2
|
Build-Depends: debhelper, sphinx-doc, dh-linktree, dh-apache2
|
||||||
,cmake
|
,cmake
|
||||||
,libavdevice-dev
|
|
||||||
,libavcodec-dev
|
,libavcodec-dev
|
||||||
,libavformat-dev
|
,libavformat-dev
|
||||||
,libavutil-dev
|
,libavutil-dev
|
||||||
|
@ -14,7 +13,6 @@ Build-Depends: debhelper, sphinx-doc, dh-linktree, dh-apache2
|
||||||
,ffmpeg
|
,ffmpeg
|
||||||
,net-tools
|
,net-tools
|
||||||
,libbz2-dev
|
,libbz2-dev
|
||||||
,libgcrypt20-dev
|
|
||||||
,libcurl4-gnutls-dev
|
,libcurl4-gnutls-dev
|
||||||
,libturbojpeg0-dev
|
,libturbojpeg0-dev
|
||||||
,default-libmysqlclient-dev | libmysqlclient-dev | libmariadbclient-dev-compat
|
,default-libmysqlclient-dev | libmysqlclient-dev | libmariadbclient-dev-compat
|
||||||
|
|
|
@ -41,7 +41,6 @@ Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||||
License: Expat
|
License: Expat
|
||||||
|
|
||||||
Files:
|
Files:
|
||||||
cmake/Modules/CheckPrototypeDefinition*.cmake
|
|
||||||
cmake/Modules/FindGLIB2.cmake
|
cmake/Modules/FindGLIB2.cmake
|
||||||
cmake/Modules/FindPolkit.cmake
|
cmake/Modules/FindPolkit.cmake
|
||||||
cmake/Modules/GNUInstallDirs.cmake
|
cmake/Modules/GNUInstallDirs.cmake
|
||||||
|
|
|
@ -9,7 +9,6 @@ Build-Depends: debhelper (>= 9), cmake
|
||||||
, libjpeg8-dev | libjpeg-dev
|
, libjpeg8-dev | libjpeg-dev
|
||||||
, libpcre3-dev
|
, libpcre3-dev
|
||||||
, libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev
|
, libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev
|
||||||
, libavdevice-dev
|
|
||||||
, libv4l-dev (>= 0.8.3)
|
, libv4l-dev (>= 0.8.3)
|
||||||
, libbz2-dev
|
, libbz2-dev
|
||||||
, ffmpeg | libav-tools
|
, ffmpeg | libav-tools
|
||||||
|
@ -17,7 +16,7 @@ Build-Depends: debhelper (>= 9), cmake
|
||||||
, libnetpbm10-dev
|
, libnetpbm10-dev
|
||||||
, libvlccore-dev, libvlc-dev
|
, libvlccore-dev, libvlc-dev
|
||||||
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
||||||
, libgcrypt11-dev, libpolkit-gobject-1-dev
|
, libpolkit-gobject-1-dev
|
||||||
, libphp-serialization-perl
|
, libphp-serialization-perl
|
||||||
, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl, libdbd-mysql-perl
|
, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl, libdbd-mysql-perl
|
||||||
, libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl
|
, libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl
|
||||||
|
@ -47,7 +46,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
||||||
,libnumber-bytes-human-perl
|
,libnumber-bytes-human-perl
|
||||||
,libfile-slurp-perl
|
,libfile-slurp-perl
|
||||||
, libpcre3
|
, libpcre3
|
||||||
, ffmpeg | libav-tools, libavdevice53 | libavdevice55 | libavdevice57
|
, ffmpeg | libav-tools
|
||||||
, rsyslog | system-log-daemon
|
, rsyslog | system-log-daemon
|
||||||
, netpbm
|
, netpbm
|
||||||
, zip
|
, zip
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
../redhat/misc/redalert.wav
|
../redhat/common/redalert.wav
|
|
@ -27,7 +27,7 @@ Source: ZoneMinder-%{version}.tar.gz
|
||||||
|
|
||||||
BuildRequires: cmake polkit-devel
|
BuildRequires: cmake polkit-devel
|
||||||
BuildRequires: perl-DBI perl-DBD-mysql perl-Date-Manip perl-Sys-Mmap
|
BuildRequires: perl-DBI perl-DBD-mysql perl-Date-Manip perl-Sys-Mmap
|
||||||
BuildRequires: libjpeg62 libjpeg62-devel libmysqld-devel libSDL-devel libgcrypt-devel libgnutls-devel
|
BuildRequires: libjpeg62 libjpeg62-devel libmysqld-devel libSDL-devel libgnutls-devel
|
||||||
BuildRequires: libffmpeg-devel x264
|
BuildRequires: libffmpeg-devel x264
|
||||||
BuildRequires: pcre-devel w32codec-all
|
BuildRequires: pcre-devel w32codec-all
|
||||||
|
|
||||||
|
|
|
@ -8,27 +8,35 @@
|
||||||
# CakePHP-Enum-Behavior is configured as a git submodule
|
# CakePHP-Enum-Behavior is configured as a git submodule
|
||||||
%global ceb_version 1.0-zm
|
%global ceb_version 1.0-zm
|
||||||
|
|
||||||
|
# RtspServer is configured as a git submodule
|
||||||
|
%global rtspserver_commit cd7fd49becad6010a1b8466bfebbd93999a39878
|
||||||
|
|
||||||
%global sslcert %{_sysconfdir}/pki/tls/certs/localhost.crt
|
%global sslcert %{_sysconfdir}/pki/tls/certs/localhost.crt
|
||||||
%global sslkey %{_sysconfdir}/pki/tls/private/localhost.key
|
%global sslkey %{_sysconfdir}/pki/tls/private/localhost.key
|
||||||
|
|
||||||
# This will tell zoneminder's cmake process we are building against a known distro
|
# This will tell zoneminder's cmake process we are building against a known distro
|
||||||
%global zmtargetdistro %{?rhel:el%{rhel}}%{!?rhel:fc%{fedora}}
|
%global zmtargetdistro %{?rhel:el%{rhel}}%{!?rhel:fc%{fedora}}
|
||||||
|
|
||||||
# Fedora needs apcu backwards compatibility module
|
|
||||||
%if 0%{?fedora}
|
|
||||||
%global with_apcu_bc 1
|
|
||||||
%endif
|
|
||||||
|
|
||||||
# Newer php's keep json functions in a subpackage
|
# Newer php's keep json functions in a subpackage
|
||||||
%if 0%{?fedora} || 0%{?rhel} >= 8
|
%if 0%{?fedora} || 0%{?rhel} >= 8
|
||||||
%global with_php_json 1
|
%global with_php_json 1
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
# el7 uses cmake3 package and macros
|
||||||
|
%if 0%{?rhel} == 7
|
||||||
|
%global cmake %{cmake3}
|
||||||
|
%global cmake_build %{cmake3_build}
|
||||||
|
%global cmake_install %{cmake3_install}
|
||||||
|
%global cmake_pkg_name cmake3
|
||||||
|
%else
|
||||||
|
%global cmake_pkg_name cmake
|
||||||
|
%endif
|
||||||
|
|
||||||
# The default for everything but el7 these days
|
# The default for everything but el7 these days
|
||||||
%global _hardened_build 1
|
%global _hardened_build 1
|
||||||
|
|
||||||
Name: zoneminder
|
Name: zoneminder
|
||||||
Version: 1.35.18
|
Version: 1.37.1
|
||||||
Release: 1%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: A camera monitoring and analysis tool
|
Summary: A camera monitoring and analysis tool
|
||||||
Group: System Environment/Daemons
|
Group: System Environment/Daemons
|
||||||
|
@ -39,19 +47,21 @@ Group: System Environment/Daemons
|
||||||
# Bootstrap is under the MIT license: https://getbootstrap.com/docs/4.5/about/license/
|
# Bootstrap is under the MIT license: https://getbootstrap.com/docs/4.5/about/license/
|
||||||
# Bootstrap-table is under the MIT license: https://bootstrap-table.com/docs/about/license/
|
# Bootstrap-table is under the MIT license: https://bootstrap-table.com/docs/about/license/
|
||||||
# font-awesome is under CC-BY license: https://fontawesome.com/license/free
|
# font-awesome is under CC-BY license: https://fontawesome.com/license/free
|
||||||
|
# RtspServer is under the MIT license: https://github.com/PHZ76/RtspServer/blob/master/LICENSE
|
||||||
License: GPLv2+ and LGPLv2+ and MIT
|
License: GPLv2+ and LGPLv2+ and MIT
|
||||||
URL: http://www.zoneminder.com/
|
URL: http://www.zoneminder.com/
|
||||||
|
|
||||||
Source0: https://github.com/ZoneMinder/ZoneMinder/archive/%{version}.tar.gz#/zoneminder-%{version}.tar.gz
|
Source0: https://github.com/ZoneMinder/ZoneMinder/archive/%{version}.tar.gz#/zoneminder-%{version}.tar.gz
|
||||||
Source1: https://github.com/FriendsOfCake/crud/archive/v%{crud_version}.tar.gz#/crud-%{crud_version}.tar.gz
|
Source1: https://github.com/FriendsOfCake/crud/archive/v%{crud_version}.tar.gz#/crud-%{crud_version}.tar.gz
|
||||||
Source2: https://github.com/ZoneMinder/CakePHP-Enum-Behavior/archive/%{ceb_version}.tar.gz#/cakephp-enum-behavior-%{ceb_version}.tar.gz
|
Source2: https://github.com/ZoneMinder/CakePHP-Enum-Behavior/archive/%{ceb_version}.tar.gz#/cakephp-enum-behavior-%{ceb_version}.tar.gz
|
||||||
|
Source3: https://github.com/ZoneMinder/RtspServer/archive/%{rtspserver_commit}.tar.gz#/RtspServer-%{rtspserver_commit}.tar.gz
|
||||||
|
|
||||||
%{?rhel:BuildRequires: epel-rpm-macros}
|
%{?rhel:BuildRequires: epel-rpm-macros}
|
||||||
BuildRequires: systemd-devel
|
BuildRequires: systemd-devel
|
||||||
BuildRequires: mariadb-devel
|
BuildRequires: mariadb-devel
|
||||||
BuildRequires: perl-podlators
|
BuildRequires: perl-podlators
|
||||||
BuildRequires: polkit-devel
|
BuildRequires: polkit-devel
|
||||||
BuildRequires: cmake3
|
BuildRequires: %{cmake_pkg_name}
|
||||||
BuildRequires: gnutls-devel
|
BuildRequires: gnutls-devel
|
||||||
BuildRequires: bzip2-devel
|
BuildRequires: bzip2-devel
|
||||||
BuildRequires: pcre-devel
|
BuildRequires: pcre-devel
|
||||||
|
@ -112,8 +122,8 @@ Requires: php-mysqli
|
||||||
Requires: php-common
|
Requires: php-common
|
||||||
Requires: php-gd
|
Requires: php-gd
|
||||||
%{?with_php_json:Requires: php-json}
|
%{?with_php_json:Requires: php-json}
|
||||||
Requires: php-pecl-apcu
|
%{?fedora:Requires: php-pecl-memcached}
|
||||||
%{?with_apcu_bc:Requires: php-pecl-apcu-bc}
|
%{?rhel:Requires: php-pecl-apcu}
|
||||||
Requires: cambozola
|
Requires: cambozola
|
||||||
Requires: net-tools
|
Requires: net-tools
|
||||||
Requires: psmisc
|
Requires: psmisc
|
||||||
|
@ -199,6 +209,10 @@ gzip -dc %{_sourcedir}/cakephp-enum-behavior-%{ceb_version}.tar.gz | tar -xvvf -
|
||||||
rm -rf ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
rm -rf ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
||||||
mv -f CakePHP-Enum-Behavior-%{ceb_version} ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
mv -f CakePHP-Enum-Behavior-%{ceb_version} ./web/api/app/Plugin/CakePHP-Enum-Behavior
|
||||||
|
|
||||||
|
gzip -dc %{_sourcedir}/RtspServer-%{rtspserver_commit}.tar.gz | tar -xvvf -
|
||||||
|
rm -rf ./dep/RtspServer
|
||||||
|
mv -f RtspServer-%{rtspserver_commit} ./dep/RtspServer
|
||||||
|
|
||||||
# Change the following default values
|
# Change the following default values
|
||||||
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes
|
./utils/zmeditconfigdata.sh ZM_OPT_CAMBOZOLA yes
|
||||||
./utils/zmeditconfigdata.sh ZM_OPT_CONTROL yes
|
./utils/zmeditconfigdata.sh ZM_OPT_CONTROL yes
|
||||||
|
@ -209,16 +223,16 @@ mv -f CakePHP-Enum-Behavior-%{ceb_version} ./web/api/app/Plugin/CakePHP-Enum-Beh
|
||||||
# See https://fedoraproject.org/wiki/LTOByDefault
|
# See https://fedoraproject.org/wiki/LTOByDefault
|
||||||
%define _lto_cflags %{nil}
|
%define _lto_cflags %{nil}
|
||||||
|
|
||||||
%cmake3 \
|
%cmake \
|
||||||
-DZM_WEB_USER="%{zmuid_final}" \
|
-DZM_WEB_USER="%{zmuid_final}" \
|
||||||
-DZM_WEB_GROUP="%{zmgid_final}" \
|
-DZM_WEB_GROUP="%{zmgid_final}" \
|
||||||
-DZM_TARGET_DISTRO="%{zmtargetdistro}" \
|
-DZM_TARGET_DISTRO="%{zmtargetdistro}" \
|
||||||
.
|
.
|
||||||
|
|
||||||
%cmake3_build
|
%cmake_build
|
||||||
|
|
||||||
%install
|
%install
|
||||||
%cmake3_install
|
%cmake_install
|
||||||
|
|
||||||
desktop-file-install \
|
desktop-file-install \
|
||||||
--dir %{buildroot}%{_datadir}/applications \
|
--dir %{buildroot}%{_datadir}/applications \
|
||||||
|
@ -362,6 +376,7 @@ ln -sf %{_sysconfdir}/zm/www/zoneminder.nginx.conf %{_sysconfdir}/zm/www/zonemin
|
||||||
%{_bindir}/zmonvif-trigger.pl
|
%{_bindir}/zmonvif-trigger.pl
|
||||||
%{_bindir}/zmstats.pl
|
%{_bindir}/zmstats.pl
|
||||||
%{_bindir}/zmrecover.pl
|
%{_bindir}/zmrecover.pl
|
||||||
|
%{_bindir}/zm_rtsp_server
|
||||||
|
|
||||||
%{perl_vendorlib}/ZoneMinder*
|
%{perl_vendorlib}/ZoneMinder*
|
||||||
%{perl_vendorlib}/ONVIF*
|
%{perl_vendorlib}/ONVIF*
|
||||||
|
@ -417,6 +432,116 @@ ln -sf %{_sysconfdir}/zm/www/zoneminder.nginx.conf %{_sysconfdir}/zm/www/zonemin
|
||||||
%dir %attr(755,nginx,nginx) %{_localstatedir}/log/zoneminder
|
%dir %attr(755,nginx,nginx) %{_localstatedir}/log/zoneminder
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Jul 05 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.37.1-1
|
||||||
|
- 1.37.x development build
|
||||||
|
|
||||||
|
* Tue Jun 22 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.5-1
|
||||||
|
- 1.36.5 release
|
||||||
|
|
||||||
|
* Fri Jun 18 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.4-2
|
||||||
|
- apcu-bc deprecated on fedora, use memcached instead
|
||||||
|
- only refer to cmake3 when building on el7
|
||||||
|
|
||||||
|
* Tue Jun 08 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.4-1
|
||||||
|
- 1.36.4 release
|
||||||
|
|
||||||
|
* Sun May 30 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.3-1
|
||||||
|
- 1.36.3 release
|
||||||
|
|
||||||
|
* Fri May 28 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.2-1
|
||||||
|
- 1.36.2 release
|
||||||
|
|
||||||
|
* Fri May 21 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.1-1
|
||||||
|
- 1.36.1 release
|
||||||
|
- add rtspserver submodule
|
||||||
|
|
||||||
|
* Wed Apr 21 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.26-1
|
||||||
|
- 1.34.26 Release
|
||||||
|
|
||||||
|
* Sun Apr 18 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.24-1
|
||||||
|
- 1.34.24 Release
|
||||||
|
|
||||||
|
* Thu Feb 04 2021 RPM Fusion Release Engineering <leigh123linux@gmail.com> - 1.34.23-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sun Jan 31 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.23-1
|
||||||
|
- 1.34.23 Release
|
||||||
|
- create ssl cert in all cases, not just nginx
|
||||||
|
|
||||||
|
* Fri Jan 1 2021 Leigh Scott <leigh123linux@gmail.com> - 1.34.22-3
|
||||||
|
- Rebuilt for new ffmpeg snapshot
|
||||||
|
|
||||||
|
* Fri Nov 27 2020 Sérgio Basto <sergio@serjux.com> - 1.34.22-2
|
||||||
|
- Mass rebuild for x264-0.161
|
||||||
|
|
||||||
|
* Mon Sep 28 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.22-1
|
||||||
|
- 1.34.22 Release
|
||||||
|
|
||||||
|
* Mon Sep 28 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.21-1
|
||||||
|
- 1.34.21 Release
|
||||||
|
|
||||||
|
* Sun Aug 23 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.20-1
|
||||||
|
- 1.34.20 Release
|
||||||
|
- Buildrequire epel-rpm-macros on rhel
|
||||||
|
- Update license references for js libraries
|
||||||
|
|
||||||
|
* Wed Aug 19 2020 RPM Fusion Release Engineering <leigh123linux@gmail.com> - 1.34.18-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Aug 06 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.18-1
|
||||||
|
- 1.34.18 Release
|
||||||
|
|
||||||
|
* Thu Aug 06 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.17-2
|
||||||
|
- Disable LTO due to top level asm
|
||||||
|
|
||||||
|
* Wed Aug 05 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.17-1
|
||||||
|
- 1.34.17 Release
|
||||||
|
|
||||||
|
* Tue Aug 04 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.16-4
|
||||||
|
- Use new cmake build macros for f33 compat
|
||||||
|
|
||||||
|
* Tue Jul 07 2020 Sérgio Basto <sergio@serjux.com> - 1.34.16-3
|
||||||
|
- Mass rebuild for x264
|
||||||
|
|
||||||
|
* Fri Jul 03 2020 Leigh Scott <leigh123linux@gmail.com> - 1.34.16-2
|
||||||
|
- Perl 5.32 rebuild
|
||||||
|
|
||||||
|
* Fri Jun 05 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.16-1
|
||||||
|
- 1.34.16 Release
|
||||||
|
|
||||||
|
* Fri May 15 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.14-1
|
||||||
|
- 1.34.14 Release
|
||||||
|
|
||||||
|
* Thu May 14 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.13-1
|
||||||
|
- 1.34.13 Release
|
||||||
|
|
||||||
|
* Sun May 10 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.12-1
|
||||||
|
- 1.34.12 Release
|
||||||
|
|
||||||
|
* Sat May 2 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.11-1
|
||||||
|
- 1.34.11 Release
|
||||||
|
|
||||||
|
* Sun Apr 26 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.10-1
|
||||||
|
- 1.34.10 Release
|
||||||
|
|
||||||
|
* Mon Apr 6 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.9-1
|
||||||
|
- 1.34.9 Release
|
||||||
|
|
||||||
|
* Sat Mar 28 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.7-1
|
||||||
|
- 1.34.7 Release
|
||||||
|
|
||||||
|
* Mon Mar 23 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.6-1
|
||||||
|
- 1.34.6 Release
|
||||||
|
|
||||||
|
* Sat Feb 29 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.5-1
|
||||||
|
- 1.34.5 Release
|
||||||
|
|
||||||
|
* Sun Feb 23 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.3-1
|
||||||
|
- 1.34.3 Release
|
||||||
|
|
||||||
|
* Sat Feb 22 2020 RPM Fusion Release Engineering <leigh123linux@googlemail.com> - 1.34.2-2
|
||||||
|
- Rebuild for ffmpeg-4.3 git
|
||||||
|
|
||||||
* Tue Feb 04 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.2-1
|
* Tue Feb 04 2020 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.34.2-1
|
||||||
- 1.34.2 Release
|
- 1.34.2 Release
|
||||||
|
|
||||||
|
|
|
@ -8,14 +8,14 @@ Build-Depends: debhelper (>= 9), po-debconf (>= 1.0), autoconf, automake, libtoo
|
||||||
, libdate-manip-perl, libwww-perl
|
, libdate-manip-perl, libwww-perl
|
||||||
, libjpeg8-dev | libjpeg9-dev | libjpeg62-turbo-dev
|
, libjpeg8-dev | libjpeg9-dev | libjpeg62-turbo-dev
|
||||||
, libpcre3-dev
|
, libpcre3-dev
|
||||||
, libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev, libavdevice-ffmpeg-dev
|
, libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev
|
||||||
, libv4l-dev (>= 0.8.3)
|
, libv4l-dev (>= 0.8.3)
|
||||||
, libbz2-dev
|
, libbz2-dev
|
||||||
, libsys-mmap-perl
|
, libsys-mmap-perl
|
||||||
, libdevice-serialport-perl, libarchive-zip-perl, libmime-lite-perl
|
, libdevice-serialport-perl, libarchive-zip-perl, libmime-lite-perl
|
||||||
, libvlccore-dev, libvlc-dev
|
, libvlccore-dev, libvlc-dev
|
||||||
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
||||||
, libgcrypt11-dev | libgcrypt20-dev, libpolkit-gobject-1-dev
|
, libpolkit-gobject-1-dev
|
||||||
, libdbi-perl, libnet-sftp-foreign-perl, libexpect-perl, libmime-tools-perl
|
, libdbi-perl, libnet-sftp-foreign-perl, libexpect-perl, libmime-tools-perl
|
||||||
Standards-Version: 3.9.6
|
Standards-Version: 3.9.6
|
||||||
Homepage: http://www.zoneminder.com/
|
Homepage: http://www.zoneminder.com/
|
||||||
|
|
|
@ -15,7 +15,6 @@ DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
||||||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
||||||
|
|
||||||
CFLAGS = -Wall
|
CFLAGS = -Wall
|
||||||
CXXFLAGS = -DHAVE_LIBCRYPTO
|
|
||||||
|
|
||||||
ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
|
ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
|
||||||
DEBOPT = --enable-debug
|
DEBOPT = --enable-debug
|
||||||
|
@ -72,7 +71,7 @@ override_dh_auto_test:
|
||||||
override_dh_clean:
|
override_dh_clean:
|
||||||
# Add here commands to clean up after the build process.
|
# Add here commands to clean up after the build process.
|
||||||
[ ! -f Makefile ] || $(MAKE) distclean
|
[ ! -f Makefile ] || $(MAKE) distclean
|
||||||
dh_clean src/zm_config_defines.h
|
dh_clean zm_config_defines.h
|
||||||
#
|
#
|
||||||
# Delete remaining auto-generated Makefile if Makefile.in exists
|
# Delete remaining auto-generated Makefile if Makefile.in exists
|
||||||
find $(CURDIR)/ -type f -name "Makefile" | while read file; do \
|
find $(CURDIR)/ -type f -name "Makefile" | while read file; do \
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
zoneminder (1.28.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
This version is no longer automatically initialize or upgrade database.
|
|
||||||
See README.Debian for details.
|
|
||||||
|
|
||||||
Changed installation paths (please correct your web server configuration):
|
|
||||||
/usr/share/zoneminder --> /usr/share/zoneminder/www
|
|
||||||
/usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin
|
|
||||||
|
|
||||||
-- Dmitry Smirnov <onlyjob@debian.org> Tue, 31 Mar 2015 15:12:17 +1100
|
|
|
@ -1,130 +0,0 @@
|
||||||
Zoneminder for Debian
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Initializing database
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
pv /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf
|
|
||||||
OR
|
|
||||||
cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf
|
|
||||||
|
|
||||||
echo 'grant lock tables,alter,create,index,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\
|
|
||||||
| sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
|
||||||
|
|
||||||
Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf"
|
|
||||||
accordingly.
|
|
||||||
|
|
||||||
The following command can help to ensure that zoneminder can read its
|
|
||||||
configuration file:
|
|
||||||
|
|
||||||
chgrp -c www-data /etc/zm/zm.conf
|
|
||||||
|
|
||||||
|
|
||||||
Upgrading database
|
|
||||||
------------------
|
|
||||||
|
|
||||||
The database is updated automatically on installation. You should not need to take this step.
|
|
||||||
|
|
||||||
Assuming that database is on "localhost" then the following command can be
|
|
||||||
used to upgrade "zm" database:
|
|
||||||
|
|
||||||
zmupdate.pl
|
|
||||||
|
|
||||||
Additional permissions may be required to perform upgrade:
|
|
||||||
|
|
||||||
echo 'grant lock tables, create, alter on zm.* to 'zmuser'@localhost identified by "zmpass";'\
|
|
||||||
| sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
|
||||||
|
|
||||||
The following command prints the current version of zoneminder database:
|
|
||||||
|
|
||||||
echo 'select Value from Config where Name = "ZM_DYN_CURR_VERSION";' \
|
|
||||||
| sudo mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names zm
|
|
||||||
|
|
||||||
|
|
||||||
Enabling service
|
|
||||||
----------------
|
|
||||||
|
|
||||||
By default Zoneminder service is not automatically started and needs to be
|
|
||||||
manually enabled once database is configured:
|
|
||||||
|
|
||||||
sudo systemctl enable zoneminder.service
|
|
||||||
|
|
||||||
|
|
||||||
Web server set-up
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
There are few manual steps to get the web interface working:
|
|
||||||
|
|
||||||
## Apache2
|
|
||||||
|
|
||||||
Apache can be configured as folder "/zm" using sample .conf:
|
|
||||||
|
|
||||||
sudo a2enconf zoneminder
|
|
||||||
|
|
||||||
Alternatively Apache web site configuration template can be used to setup
|
|
||||||
zoneminder as "http://zoneminder":
|
|
||||||
|
|
||||||
sudo cp -v /usr/share/doc/zoneminder/examples/apache.conf /etc/apache2/sites-available/
|
|
||||||
sudo a2ensite zoneminder.conf
|
|
||||||
|
|
||||||
Common configuration steps for Apache2:
|
|
||||||
|
|
||||||
sudo a2enmod cgi
|
|
||||||
sudo service apache2 reload
|
|
||||||
|
|
||||||
|
|
||||||
## nginx / fcgiwrap
|
|
||||||
|
|
||||||
Nginx needs "php-fpm" package to support PHP and "fcgiwrap" package
|
|
||||||
for binary "cgi-bin" applications:
|
|
||||||
|
|
||||||
sudo apt-get install php-fpm fcgiwrap
|
|
||||||
|
|
||||||
To enable a URL alias that makes Zoneminder available from
|
|
||||||
|
|
||||||
http://yourserver/zm
|
|
||||||
|
|
||||||
the following line is to be added to "server" section of a web site
|
|
||||||
configuration:
|
|
||||||
|
|
||||||
include /usr/share/doc/zoneminder/examples/nginx.conf;
|
|
||||||
|
|
||||||
For "default" web site it would be sufficient to include the above
|
|
||||||
statement to the file
|
|
||||||
|
|
||||||
/etc/nginx/sites-enabled/default
|
|
||||||
|
|
||||||
To avoid problems with feeds from multiple cameras "fcgiwrap" should be
|
|
||||||
configured to start at least as many processes as there are cameras.
|
|
||||||
It can be done by adjusting DAEMON_OPTS in "/etc/default/fcgiwrap".
|
|
||||||
Systemd users may be affected by the following bug:
|
|
||||||
|
|
||||||
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=792705
|
|
||||||
|
|
||||||
|
|
||||||
## Note:
|
|
||||||
|
|
||||||
When Zoneminder web site is running it may be necessary to set
|
|
||||||
Options/Paths/PATH_ZMS to "/zm/cgi-bin/nph-zms" or according to chosen web
|
|
||||||
site configuration.
|
|
||||||
|
|
||||||
|
|
||||||
Changing the location for images and events
|
|
||||||
-------------------------------------------
|
|
||||||
|
|
||||||
ZoneMinder is now able to be configured to use an alternative location for storing
|
|
||||||
events and images at compile time. This package makes use of that, so symlinks in
|
|
||||||
/usr/share/zoneminder/www are no longer necessary.
|
|
||||||
|
|
||||||
Access to /dev/video*
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
For cameras which require access to /dev/video*, zoneminder may need the
|
|
||||||
www-data user added to the video group in order to see those cameras:
|
|
||||||
|
|
||||||
adduser www-data video
|
|
||||||
|
|
||||||
Note that all web applications running on the zoneminder server will then have
|
|
||||||
access to all video devices on the system.
|
|
||||||
|
|
||||||
-- Vagrant Cascadian <vagrant@debian.org> Sun, 27 Mar 2011 13:06:56 -0700
|
|
|
@ -1,12 +0,0 @@
|
||||||
|
|
||||||
## Separate substantial /usr/share into its own arch-all package.
|
|
||||||
|
|
||||||
## Decide how to handle database updates.
|
|
||||||
|
|
||||||
* Consider possibility that database may be on another machine (#469239).
|
|
||||||
* Consider dbconfig-common? Probably not (what if database is not on localhost?).
|
|
||||||
|
|
||||||
### Run `zmupdate.pl` from service control scripts (init.d, service) on start?
|
|
||||||
|
|
||||||
Automatic upgrade will break "one DB, many zoneminders" setup (unimportant?).
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
zoneminder (1.35.6~20200825.27-xenial) xenial; urgency=low
|
|
||||||
*
|
|
||||||
-- Isaac Connor <isaac@zoneminder.com> Tue, 25 Aug 2020 09:28:18 -0400
|
|
|
@ -1,3 +0,0 @@
|
||||||
.gitattributes
|
|
||||||
web/api/.gitattributes
|
|
||||||
web/api/.gitignore
|
|
|
@ -1 +0,0 @@
|
||||||
9
|
|
|
@ -1,57 +0,0 @@
|
||||||
# Remember to enable cgi mod (i.e. "a2enmod cgi").
|
|
||||||
ScriptAlias /zm/cgi-bin "/usr/lib/zoneminder/cgi-bin"
|
|
||||||
<Directory "/usr/lib/zoneminder/cgi-bin">
|
|
||||||
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
|
|
||||||
AllowOverride All
|
|
||||||
Require all granted
|
|
||||||
</Directory>
|
|
||||||
|
|
||||||
|
|
||||||
# Order matters. This alias must come first.
|
|
||||||
Alias /zm/cache /var/cache/zoneminder/cache
|
|
||||||
<Directory /var/cache/zoneminder/cache>
|
|
||||||
Options -Indexes +FollowSymLinks
|
|
||||||
AllowOverride None
|
|
||||||
<IfModule mod_authz_core.c>
|
|
||||||
# Apache 2.4
|
|
||||||
Require all granted
|
|
||||||
</IfModule>
|
|
||||||
<IfModule !mod_authz_core.c>
|
|
||||||
# Apache 2.2
|
|
||||||
Order deny,allow
|
|
||||||
Allow from all
|
|
||||||
</IfModule>
|
|
||||||
</Directory>
|
|
||||||
|
|
||||||
Alias /zm /usr/share/zoneminder/www
|
|
||||||
<Directory /usr/share/zoneminder/www>
|
|
||||||
Options -Indexes +FollowSymLinks
|
|
||||||
<IfModule mod_dir.c>
|
|
||||||
DirectoryIndex index.php
|
|
||||||
</IfModule>
|
|
||||||
</Directory>
|
|
||||||
|
|
||||||
# For better visibility, the following directives have been migrated from the
|
|
||||||
# default .htaccess files included with the CakePHP project.
|
|
||||||
# Parameters not set here are inherited from the parent directive above.
|
|
||||||
<Directory "/usr/share/zoneminder/www/api">
|
|
||||||
RewriteEngine on
|
|
||||||
RewriteRule ^$ app/webroot/ [L]
|
|
||||||
RewriteRule (.*) app/webroot/$1 [L]
|
|
||||||
RewriteBase /zm/api
|
|
||||||
</Directory>
|
|
||||||
|
|
||||||
<Directory "/usr/share/zoneminder/www/api/app">
|
|
||||||
RewriteEngine on
|
|
||||||
RewriteRule ^$ webroot/ [L]
|
|
||||||
RewriteRule (.*) webroot/$1 [L]
|
|
||||||
RewriteBase /zm/api
|
|
||||||
</Directory>
|
|
||||||
|
|
||||||
<Directory "/usr/share/zoneminder/www/api/app/webroot">
|
|
||||||
RewriteEngine On
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
|
||||||
RewriteRule ^ index.php [L]
|
|
||||||
RewriteBase /zm/api
|
|
||||||
</Directory>
|
|
|
@ -1,167 +0,0 @@
|
||||||
Source: zoneminder
|
|
||||||
Section: net
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Isaac Connor <isaac@zoneminder.com>
|
|
||||||
Uploaders: Isaac Connor <isaac@zoneminder.com>
|
|
||||||
Build-Depends: debhelper (>= 9), dh-systemd, python3-sphinx, apache2-dev, dh-linktree, dh-systemd, dh-apache2
|
|
||||||
,cmake
|
|
||||||
,libavdevice-dev (>= 6:10~)
|
|
||||||
,libavcodec-dev (>= 6:10~)
|
|
||||||
,libavformat-dev (>= 6:10~)
|
|
||||||
,libavutil-dev (>= 6:10~)
|
|
||||||
,libswresample-dev | libavresample-dev
|
|
||||||
,libswscale-dev (>= 6:10~)
|
|
||||||
,ffmpeg | libav-tools
|
|
||||||
,net-tools
|
|
||||||
,libbz2-dev
|
|
||||||
,libgcrypt-dev | libgcrypt11-dev
|
|
||||||
,libcurl4-gnutls-dev
|
|
||||||
,libgnutls-openssl-dev
|
|
||||||
,libjpeg8-dev | libjpeg9-dev | libjpeg62-turbo-dev
|
|
||||||
,default-libmysqlclient-dev | libmysqlclient-dev | libmariadbclient-dev-compat
|
|
||||||
,libpcre3-dev
|
|
||||||
,libpolkit-gobject-1-dev
|
|
||||||
,libv4l-dev (>= 0.8.3) [!hurd-any]
|
|
||||||
,libvlc-dev
|
|
||||||
,libdate-manip-perl
|
|
||||||
,libdbd-mysql-perl
|
|
||||||
,libphp-serialization-perl
|
|
||||||
,libsys-mmap-perl [!hurd-any]
|
|
||||||
,libwww-perl
|
|
||||||
,libdata-uuid-perl
|
|
||||||
,libssl-dev
|
|
||||||
,libcrypt-eksblowfish-perl
|
|
||||||
,libdata-entropy-perl
|
|
||||||
,libvncserver-dev
|
|
||||||
# Unbundled (dh_linktree):
|
|
||||||
,libjs-jquery
|
|
||||||
Standards-Version: 3.9.8
|
|
||||||
Homepage: http://www.zoneminder.com/
|
|
||||||
Vcs-Browser: http://anonscm.debian.org/cgit/collab-maint/zoneminder.git
|
|
||||||
Vcs-Git: git://anonscm.debian.org/collab-maint/zoneminder.git
|
|
||||||
|
|
||||||
Package: zoneminder
|
|
||||||
Architecture: any
|
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
|
||||||
,javascript-common
|
|
||||||
,libswscale-ffmpeg3|libswscale4|libswscale3|libswscale5
|
|
||||||
,libswresample2|libswresample3|libswresample24|libswresample-ffmpeg1
|
|
||||||
,ffmpeg | libav-tools
|
|
||||||
,libdate-manip-perl, libmime-lite-perl, libmime-tools-perl
|
|
||||||
,libdbd-mysql-perl
|
|
||||||
,libphp-serialization-perl
|
|
||||||
,libmodule-load-conditional-perl
|
|
||||||
,libnet-sftp-foreign-perl
|
|
||||||
,libarchive-zip-perl
|
|
||||||
,libdbd-mysql-perl
|
|
||||||
,libdevice-serialport-perl
|
|
||||||
,libimage-info-perl
|
|
||||||
,libjson-maybexs-perl
|
|
||||||
,libsys-mmap-perl [!hurd-any]
|
|
||||||
,liburi-encode-perl
|
|
||||||
,libwww-perl, liburi-perl
|
|
||||||
,libdata-dump-perl
|
|
||||||
,libdatetime-perl
|
|
||||||
,libclass-std-fast-perl
|
|
||||||
,libsoap-wsdl-perl
|
|
||||||
,libio-socket-multicast-perl
|
|
||||||
,libdigest-sha-perl
|
|
||||||
,libsys-cpu-perl, libsys-meminfo-perl
|
|
||||||
,libdata-uuid-perl
|
|
||||||
,libnumber-bytes-human-perl
|
|
||||||
,libfile-slurp-perl
|
|
||||||
,mysql-client | mariadb-client | virtual-mysql-client
|
|
||||||
,perl-modules
|
|
||||||
,php5-mysql | php-mysql, php5-gd | php-gd , php5-apcu | php-apcu , php-apc | php-apcu-bc, php-json | php5-json
|
|
||||||
,policykit-1
|
|
||||||
,rsyslog | system-log-daemon
|
|
||||||
,zip
|
|
||||||
,libpcre3
|
|
||||||
,libssl | libssl1.0.0 | libssl1.1
|
|
||||||
,libcrypt-eksblowfish-perl
|
|
||||||
,libdata-entropy-perl
|
|
||||||
,libvncclient1|libvncclient0
|
|
||||||
Recommends: ${misc:Recommends}
|
|
||||||
,libapache2-mod-php5 | libapache2-mod-php | php5-fpm | php-fpm
|
|
||||||
,mysql-server | mariadb-server | virtual-mysql-server
|
|
||||||
,zoneminder-doc (>= ${source:Version})
|
|
||||||
,ffmpeg
|
|
||||||
Suggests: fcgiwrap, logrotate
|
|
||||||
Description: video camera security and surveillance solution
|
|
||||||
ZoneMinder is intended for use in single or multi-camera video security
|
|
||||||
applications, including commercial or home CCTV, theft prevention and child
|
|
||||||
or family member or home monitoring and other care scenarios. It
|
|
||||||
supports capture, analysis, recording, and monitoring of video data coming
|
|
||||||
from one or more video or network cameras attached to a Linux system.
|
|
||||||
ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
|
||||||
cameras using a variety of protocols. It is suitable for use as a home
|
|
||||||
video security system and for commercial or professional video security
|
|
||||||
and surveillance. It can also be integrated into a home automation system
|
|
||||||
via X.10 or other protocols.
|
|
||||||
|
|
||||||
#Package: libzoneminder-perl
|
|
||||||
#Section: perl
|
|
||||||
#Architecture: all
|
|
||||||
#Multi-Arch: foreign
|
|
||||||
#Depends: ${misc:Depends}, ${perl:Depends}
|
|
||||||
# ,libarchive-zip-perl
|
|
||||||
# ,libdbd-mysql-perl
|
|
||||||
# ,libdevice-serialport-perl
|
|
||||||
# ,libimage-info-perl
|
|
||||||
# ,libjson-maybexs-perl
|
|
||||||
# ,libsys-mmap-perl [!hurd-any]
|
|
||||||
# ,liburi-encode-perl
|
|
||||||
# ,libwww-perl
|
|
||||||
#Description: ZoneMinder Perl libraries
|
|
||||||
# ZoneMinder is intended for use in single or multi-camera video security
|
|
||||||
# applications, including commercial or home CCTV, theft prevention and child
|
|
||||||
# or family member or home monitoring and other care scenarios. It
|
|
||||||
# supports capture, analysis, recording, and monitoring of video data coming
|
|
||||||
# from one or more video or network cameras attached to a Linux system.
|
|
||||||
# ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
|
||||||
# cameras using a variety of protocols. It is suitable for use as a home
|
|
||||||
# video security system and for commercial or professional video security
|
|
||||||
# and surveillance. It can also be integrated into a home automation system
|
|
||||||
# via X.10 or other protocols.
|
|
||||||
# .
|
|
||||||
# This package provides ZoneMinder Perl libraries; it can be used to
|
|
||||||
# write custom interfaces as well.
|
|
||||||
|
|
||||||
Package: zoneminder-doc
|
|
||||||
Section: doc
|
|
||||||
Architecture: all
|
|
||||||
Multi-Arch: foreign
|
|
||||||
Depends: ${misc:Depends}, ${sphinxdoc:Depends}, python3-sphinx-rtd-theme
|
|
||||||
Suggests: www-browser
|
|
||||||
Description: ZoneMinder documentation
|
|
||||||
ZoneMinder is intended for use in single or multi-camera video security
|
|
||||||
applications, including commercial or home CCTV, theft prevention and child
|
|
||||||
or family member or home monitoring and other care scenarios. It
|
|
||||||
supports capture, analysis, recording, and monitoring of video data coming
|
|
||||||
from one or more video or network cameras attached to a Linux system.
|
|
||||||
ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
|
||||||
cameras using a variety of protocols. It is suitable for use as a home
|
|
||||||
video security system and for commercial or professional video security
|
|
||||||
and surveillance. It can also be integrated into a home automation system
|
|
||||||
via X.10 or other protocols.
|
|
||||||
.
|
|
||||||
This package provides ZoneMinder documentation in HTML format.
|
|
||||||
|
|
||||||
Package: zoneminder-dbg
|
|
||||||
Section: debug
|
|
||||||
Priority: extra
|
|
||||||
Architecture: any
|
|
||||||
Depends: zoneminder (= ${binary:Version}), ${misc:Depends}
|
|
||||||
Description: Zoneminder -- debugging symbols
|
|
||||||
ZoneMinder is intended for use in single or multi-camera video security
|
|
||||||
applications, including commercial or home CCTV, theft prevention and child
|
|
||||||
or family member or home monitoring and other care scenarios. It
|
|
||||||
supports capture, analysis, recording, and monitoring of video data coming
|
|
||||||
from one or more video or network cameras attached to a Linux system.
|
|
||||||
ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
|
||||||
cameras using a variety of protocols. It is suitable for use as a home
|
|
||||||
video security system and for commercial or professional video security
|
|
||||||
and surveillance. It can also be integrated into a home automation system
|
|
||||||
via X.10 or other protocols.
|
|
||||||
.
|
|
||||||
This package provides debugging symbols
|
|
|
@ -1,168 +0,0 @@
|
||||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: ZoneMinder
|
|
||||||
Upstream-Contact: Philip Coombes <philip.coombes@zoneminder.com>
|
|
||||||
Source: https://github.com/ZoneMinder/ZoneMinder
|
|
||||||
Comment:
|
|
||||||
This package was originally debianized by matrix <matrix@cecilia>
|
|
||||||
on Mon, 7 Mar 2005 02:07:57 -0500.
|
|
||||||
It was re-done for submission to the Debian project by Peter Howard
|
|
||||||
<pjh@northern-ridge.com.au> on Fri, 8 Dec 2006 10:19:43 +1100
|
|
||||||
Files-Excluded:
|
|
||||||
web/skins/*/js/jquery-*
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2001-2014 Philip Coombes <philip.coombes@zoneminder.com>
|
|
||||||
2008 Brian Rudy <brudyNO@SPAMpraecogito.com>
|
|
||||||
2014 Vincent Giovannone
|
|
||||||
2013 Tim Craig <timcraigNO@SPAMsonic.net>
|
|
||||||
2003-2008 Corey DeLasaux
|
|
||||||
2001-2010 Chris Kistner
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
Files: distros/*
|
|
||||||
Copyright: 2001-2008 Philip Coombes <philip.coombes@zoneminder.com>
|
|
||||||
2014 Isaac Connor <iconnor@connortechnology.com>
|
|
||||||
2005 Serg Oskin
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
Files: web/skins/*/js/jquery-*
|
|
||||||
Copyright: 2010 John Resig
|
|
||||||
2010 The Dojo Foundation
|
|
||||||
License: GPL-2 or Expat
|
|
||||||
Comment:
|
|
||||||
Dual licensed under the MIT or GPL Version 2 licenses.
|
|
||||||
http://jquery.org/license
|
|
||||||
.
|
|
||||||
Includes Sizzle.js http://sizzlejs.com/
|
|
||||||
Released under the MIT, BSD, and GPL Licenses.
|
|
||||||
|
|
||||||
Files: web/api/*
|
|
||||||
Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org)
|
|
||||||
License: Expat
|
|
||||||
|
|
||||||
Files:
|
|
||||||
cmake/Modules/CheckPrototypeDefinition*.cmake
|
|
||||||
cmake/Modules/FindGLIB2.cmake
|
|
||||||
cmake/Modules/FindPolkit.cmake
|
|
||||||
cmake/Modules/GNUInstallDirs.cmake
|
|
||||||
Copyright:
|
|
||||||
2005-2011 Kitware, Inc.
|
|
||||||
2010-2011 Andreas Schneider <asn@cryptomilk.org>
|
|
||||||
2009 Dario Freddi <drf@kde.org>
|
|
||||||
2008 Laurent Montel, <montel@kde.org>
|
|
||||||
2011 Nikita Krupen'ko <krnekit@gmail.com>
|
|
||||||
License: BSD-3-clause
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
.
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
.
|
|
||||||
* The names of Kitware, Inc., the Insight Consortium, or the names of
|
|
||||||
any consortium members, or of any contributors, may not be used to
|
|
||||||
endorse or promote products derived from this software without
|
|
||||||
specific prior written permission.
|
|
||||||
.
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
Files: cmake/Modules/FindPerlModules.cmake
|
|
||||||
Copyright: 2012 Iowa State University
|
|
||||||
License: Boost-1.0
|
|
||||||
Boost Software License - Version 1.0 - August 17th, 2003
|
|
||||||
.
|
|
||||||
Permission is hereby granted, free of charge, to any person or organization
|
|
||||||
obtaining a copy of the software and accompanying documentation covered by
|
|
||||||
this license (the "Software") to use, reproduce, display, distribute,
|
|
||||||
execute, and transmit the Software, and to prepare derivative works of the
|
|
||||||
Software, and to permit third-parties to whom the Software is furnished to
|
|
||||||
do so, all subject to the following:
|
|
||||||
.
|
|
||||||
The copyright notices in the Software and this entire statement, including
|
|
||||||
the above license grant, this restriction and the following disclaimer,
|
|
||||||
must be included in all copies of the Software, in whole or in part, and
|
|
||||||
all derivative works of the Software, unless such copies or derivative
|
|
||||||
works are solely in the form of machine-executable object code generated by
|
|
||||||
a source language processor.
|
|
||||||
.
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
||||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
||||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
||||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
Files: debian/*
|
|
||||||
Copyright: 2015 Dmitry Smirnov <onlyjob@debian.org>
|
|
||||||
2007-2014 Peter Howard <pjh@northern-ridge.com.au>
|
|
||||||
2010-2012 Vagrant Cascadian <vagrant@debian.org>
|
|
||||||
2001-2008 Philip Coombes <philip.coombes@zoneminder.com>
|
|
||||||
License: GPL-2+
|
|
||||||
|
|
||||||
License: Expat
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
.
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
.
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
License: GPL-2+
|
|
||||||
This package is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation; either version 2 of the License, or (at your
|
|
||||||
option) any later version.
|
|
||||||
.
|
|
||||||
This package is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
.
|
|
||||||
You should have received a copy of the GNU General Public
|
|
||||||
License along with this package; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
.
|
|
||||||
The complete text of the GNU General Public License version 2
|
|
||||||
can be found in "/usr/share/common-licenses/GPL-2".
|
|
||||||
|
|
||||||
License: GPL-2
|
|
||||||
This package is free software; you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by the
|
|
||||||
Free Software Foundation; version 2 of the License.
|
|
||||||
.
|
|
||||||
This package is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
General Public License for more details.
|
|
||||||
.
|
|
||||||
You should have received a copy of the GNU General Public
|
|
||||||
License along with this package; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
.
|
|
||||||
The complete text of the GNU General Public License version 2
|
|
||||||
can be found in "/usr/share/common-licenses/GPL-2".
|
|
|
@ -1,32 +0,0 @@
|
||||||
location /zm/cgi-bin {
|
|
||||||
gzip off;
|
|
||||||
alias /usr/lib/zoneminder/cgi-bin;
|
|
||||||
|
|
||||||
include /etc/nginx/fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
|
||||||
fastcgi_pass unix:/var/run/fcgiwrap.socket;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /zm {
|
|
||||||
# if ($scheme ~ ^http:){
|
|
||||||
# rewrite ^(.*)$ https://$host$1 permanent;
|
|
||||||
# }
|
|
||||||
|
|
||||||
gzip off;
|
|
||||||
alias /usr/share/zoneminder/www;
|
|
||||||
index index.php;
|
|
||||||
|
|
||||||
location ~ \.php$ {
|
|
||||||
if (!-f $request_filename) { return 404; }
|
|
||||||
expires epoch;
|
|
||||||
include /etc/nginx/fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
|
||||||
fastcgi_index index.php;
|
|
||||||
fastcgi_pass unix:/var/run/php5-fpm.sock;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.(jpg|jpeg|gif|png|ico)$ {
|
|
||||||
access_log off;
|
|
||||||
expires 33d;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
|
|
||||||
[dch]
|
|
||||||
id-length = 0
|
|
||||||
|
|
||||||
[import-orig]
|
|
||||||
pristine-tar = False
|
|
||||||
merge = False
|
|
|
@ -1,2 +0,0 @@
|
||||||
usr/share/man/man3
|
|
||||||
usr/share/perl5
|
|
|
@ -1,96 +0,0 @@
|
||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
|
||||||
export DEB_LDFLAGS_MAINT_APPEND += -Wl,--as-needed
|
|
||||||
|
|
||||||
ifeq ($(DEB_BUILD_ARCH_OS),hurd)
|
|
||||||
ARGS:= -DZM_NO_MMAP=ON
|
|
||||||
endif
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --parallel --buildsystem=cmake --builddirectory=dbuild \
|
|
||||||
--with systemd,sphinxdoc,apache2,linktree
|
|
||||||
|
|
||||||
override_dh_auto_configure:
|
|
||||||
dh_auto_configure -- $(ARGS) \
|
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DZM_CONFIG_DIR="/etc/zm" \
|
|
||||||
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
|
||||||
-DZM_RUNDIR="/run/zm" \
|
|
||||||
-DZM_SOCKDIR="/run/zm" \
|
|
||||||
-DZM_TMPDIR="/tmp/zm" \
|
|
||||||
-DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \
|
|
||||||
-DZM_CACHEDIR="/var/cache/zoneminder/cache" \
|
|
||||||
-DZM_DIR_EVENTS="/var/cache/zoneminder/events" \
|
|
||||||
-DZM_PATH_SHUTDOWN="/sbin/shutdown" \
|
|
||||||
-DZM_PATH_ZMS="/zm/cgi-bin/nph-zms"
|
|
||||||
|
|
||||||
override_dh_clean:
|
|
||||||
dh_clean $(MANPAGES1)
|
|
||||||
$(RM) -r docs/_build
|
|
||||||
|
|
||||||
build-indep:
|
|
||||||
#$(MAKE) -C docs text
|
|
||||||
$(MAKE) -C docs html
|
|
||||||
|
|
||||||
MANPAGES1 = dbuild/scripts/zmupdate.pl.1
|
|
||||||
$(MANPAGES1):
|
|
||||||
# generate man page(s):
|
|
||||||
pod2man -s1 --stderr --utf8 $(patsubst %.1, %, $@) $@
|
|
||||||
|
|
||||||
## reproducible build:
|
|
||||||
LAST_CHANGE=$(shell dpkg-parsechangelog -S Date)
|
|
||||||
BUILD_DATE=$(shell LC_ALL=C date -u "+%B %d, %Y" -d "$(LAST_CHANGE)")
|
|
||||||
override_dh_installman: $(MANPAGES1)
|
|
||||||
$(MAKE) -C docs man SPHINXOPTS="-D today=\"$(BUILD_DATE)\""
|
|
||||||
dh_installman --language=C $(MANPAGES1)
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
dh_auto_install --destdir=$(CURDIR)/debian/tmp
|
|
||||||
# remove worthless files:
|
|
||||||
$(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*/*/.packlist
|
|
||||||
$(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*.in
|
|
||||||
# remove empty directories:
|
|
||||||
find $(CURDIR)/debian/tmp/usr -type d -empty -delete -printf 'removed %p\n'
|
|
||||||
# remove extra-license-file:
|
|
||||||
$(RM) -v $(CURDIR)/debian/tmp/usr/share/zoneminder/www/api/lib/Cake/LICENSE.txt
|
|
||||||
|
|
||||||
override_dh_fixperms:
|
|
||||||
dh_fixperms
|
|
||||||
#
|
|
||||||
# As requested by the Debian Webapps Policy Manual §3.2.1
|
|
||||||
chown root:www-data $(CURDIR)/debian/zoneminder/etc/zm/zm.conf
|
|
||||||
chmod 640 $(CURDIR)/debian/zoneminder/etc/zm/zm.conf
|
|
||||||
|
|
||||||
override_dh_systemd_start:
|
|
||||||
dh_systemd_start --no-start
|
|
||||||
|
|
||||||
override_dh_systemd_enable:
|
|
||||||
dh_systemd_enable --no-enable
|
|
||||||
|
|
||||||
override_dh_apache2:
|
|
||||||
dh_apache2 --noenable
|
|
||||||
|
|
||||||
override_dh_strip:
|
|
||||||
[ -d "$(CURDIR)/debian/zoneminder-dbg" ] \
|
|
||||||
&& dh_strip --dbg-package=zoneminder-dbg \
|
|
||||||
|| dh_strip
|
|
||||||
|
|
||||||
#%:
|
|
||||||
# dh $@ --parallel --buildsystem=autoconf --with autoreconf
|
|
||||||
#
|
|
||||||
#override_dh_auto_configure:
|
|
||||||
# dh_auto_configure -- \
|
|
||||||
# --sysconfdir=/etc/zm \
|
|
||||||
# --with-mysql=/usr \
|
|
||||||
# --with-webdir=/usr/share/zoneminder \
|
|
||||||
# --with-ffmpeg=/usr \
|
|
||||||
# --with-cgidir=/usr/lib/cgi-bin \
|
|
||||||
# --with-webuser=www-data \
|
|
||||||
# --with-webgroup=www-data \
|
|
||||||
# --enable-mmap=yes
|
|
|
@ -1 +0,0 @@
|
||||||
3.0 (quilt)
|
|
|
@ -1,5 +0,0 @@
|
||||||
## We're using "libjs-jquery" instead.
|
|
||||||
source-is-missing web/skins/*/js/jquery-3.5.1.min.js
|
|
||||||
|
|
||||||
## Acknowledged, will repack eventually.
|
|
||||||
source-contains-prebuilt-javascript-object web/skins/*/js/jquery-3.5.1.min.js
|
|
|
@ -1,8 +0,0 @@
|
||||||
Document: zoneminder-doc
|
|
||||||
Title: Zoneminder documentation
|
|
||||||
Abstract: This document describes how to use Zoneminder.
|
|
||||||
Section: System/Administration
|
|
||||||
|
|
||||||
Format: HTML
|
|
||||||
Index: /usr/share/doc/zoneminder-doc/html/index.html
|
|
||||||
Files: /usr/share/doc/zoneminder-doc/html/*
|
|
|
@ -1 +0,0 @@
|
||||||
docs/_build/html usr/share/doc/zoneminder-doc/
|
|
|
@ -1,2 +0,0 @@
|
||||||
## Convenience symlink:
|
|
||||||
/usr/share/doc/zoneminder-doc/html /usr/share/doc/zoneminder/html
|
|
|
@ -1 +0,0 @@
|
||||||
conf debian/conf/apache2/zoneminder.conf nginx
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue