Compare commits
143 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
74b26a349c | ||
|
|
e9bfb157bb | ||
|
|
ef957399aa | ||
|
|
973eacf6c3 | ||
|
|
02fef7049f | ||
|
|
b2660002b9 | ||
|
|
2c0b9f959b | ||
|
|
51286d2244 | ||
|
|
712363f861 | ||
|
|
0cdd83aabf | ||
|
|
98dfb9d1b5 | ||
|
|
ae5635ff97 | ||
|
|
8a38b9d018 | ||
|
|
734cb941dd | ||
|
|
c66f8c04c8 | ||
|
|
fa24799d2b | ||
|
|
57d6a7d35e | ||
|
|
9e2d402c3a | ||
|
|
551e28eec9 | ||
|
|
9e30be8a04 | ||
|
|
8457207c8f | ||
|
|
cc4f1a1485 | ||
|
|
2ea805b7ed | ||
|
|
20ef74db42 | ||
|
|
3dda4c9116 | ||
|
|
e805feff9e | ||
|
|
0286cf6d46 | ||
|
|
6ebdfdbabb | ||
|
|
68487e1200 | ||
|
|
f19b9a44fc | ||
|
|
124af6ac6b | ||
|
|
7f126969d0 | ||
|
|
e4b0e9673d | ||
|
|
7ab44ca963 | ||
|
|
4898b58bdb | ||
|
|
9b1e7ba8a6 | ||
|
|
e3d2369151 | ||
|
|
e5f0a12c25 | ||
|
|
de6f3f866f | ||
|
|
8444a60bc9 | ||
|
|
3237411b5d | ||
|
|
5ba1659563 | ||
|
|
6e068ec339 | ||
|
|
4fd666716f | ||
|
|
6eb860ca24 | ||
|
|
903698a7b0 | ||
|
|
513faf2db5 | ||
|
|
9e46bc6c28 | ||
|
|
402fecd408 | ||
|
|
a97b15ec96 | ||
|
|
8504c9e8b9 | ||
|
|
4ebfd6624c | ||
|
|
fbaf6e2494 | ||
|
|
612d3f9b2a | ||
|
|
6e4ab5cd96 | ||
|
|
849966d2c5 | ||
|
|
1f5bcf2475 | ||
|
|
58c476195b | ||
|
|
dcd98a7bf1 | ||
|
|
686ab681e5 | ||
|
|
052f8e2c42 | ||
|
|
e9578ba8a1 | ||
|
|
0c0de5e351 | ||
|
|
10cadecd14 | ||
|
|
644084658a | ||
|
|
07936ea901 | ||
|
|
08784f9cc5 | ||
|
|
a87e615e7f | ||
|
|
df5cc7525e | ||
|
|
75b8c3455c | ||
|
|
81d38a0ded | ||
|
|
b2a8af2fa9 | ||
|
|
9d2363741e | ||
|
|
fc6a33ad38 | ||
|
|
896ce3456e | ||
|
|
9db191f0b2 | ||
|
|
c7d752fb65 | ||
|
|
5026177161 | ||
|
|
d2805442ad | ||
|
|
7765c87387 | ||
|
|
6dccf399a5 | ||
|
|
7432e3fb2d | ||
|
|
caeea9f530 | ||
|
|
0fdfd013e7 | ||
|
|
d537fc5c32 | ||
|
|
9164dda64f | ||
|
|
5ea9c31eab | ||
|
|
c8572deb5c | ||
|
|
57d25ebb20 | ||
|
|
be114176a2 | ||
|
|
1f9b04405c | ||
|
|
4ef11c463c | ||
|
|
5fb31a5a3f | ||
|
|
f0e04ab9e4 | ||
|
|
8a65081768 | ||
|
|
c451fde466 | ||
|
|
5098d69c05 | ||
|
|
b12de13041 | ||
|
|
72126f7d44 | ||
|
|
df000ce32f | ||
|
|
6a2e21f502 | ||
|
|
5ad6234584 | ||
|
|
cc79bb1449 | ||
|
|
c8d588871c | ||
|
|
8890372a69 | ||
|
|
80f2d749a2 | ||
|
|
7f7064c835 | ||
|
|
31d0b4a46c | ||
|
|
5759d4819e | ||
|
|
c49788dd9f | ||
|
|
3641a6d451 | ||
|
|
8c79070cd9 | ||
|
|
f8563bec94 | ||
|
|
fd7c0bc5fb | ||
|
|
7d708572fc | ||
|
|
ea68ff1284 | ||
|
|
66ccf4da03 | ||
|
|
0b4a13156f | ||
|
|
a8a3962008 | ||
|
|
e110a7b15e | ||
|
|
30d68309a9 | ||
|
|
547d1a5a93 | ||
|
|
adf64361e8 | ||
|
|
a43fb060f4 | ||
|
|
c607d89817 | ||
|
|
8c19b11e73 | ||
|
|
178ed82dc4 | ||
|
|
6757df5a2d | ||
|
|
044dfe2620 | ||
|
|
9e319e91d6 | ||
|
|
895a544d4c | ||
|
|
2aa9412565 | ||
|
|
35ab5c7df0 | ||
|
|
8a7cd87644 | ||
|
|
1cdf6f8263 | ||
|
|
b8ad930690 | ||
|
|
ec14a117b7 | ||
|
|
b7cc12a466 | ||
|
|
f4080a7aa9 | ||
|
|
5abfbdd1d2 | ||
|
|
31bbb2d035 | ||
|
|
33dca84ec7 | ||
|
|
460485d843 |
@@ -1938,6 +1938,24 @@
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "dampfklon",
|
||||
"name": "Dampfklon",
|
||||
"avatar_url": "https://avatars1.githubusercontent.com/u/1733625?v=4",
|
||||
"profile": "https://github.com/dampfklon",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "chamilton-ccn",
|
||||
"name": "Charles Hamilton",
|
||||
"avatar_url": "https://avatars2.githubusercontent.com/u/52973156?v=4",
|
||||
"profile": "https://communityclosing.com",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ MAIL_FROM_ADDR=you@example.com
|
||||
MAIL_FROM_NAME='Snipe-IT'
|
||||
MAIL_REPLYTO_ADDR=you@example.com
|
||||
MAIL_REPLYTO_NAME='Snipe-IT'
|
||||
MAIL_AUTO_EMBED_METHOD='attachment'
|
||||
|
||||
# --------------------------------------------
|
||||
# REQUIRED: IMAGE LIBRARY
|
||||
@@ -76,6 +77,7 @@ ENCRYPT=false
|
||||
COOKIE_NAME=snipeit_session
|
||||
COOKIE_DOMAIN=null
|
||||
SECURE_COOKIES=false
|
||||
API_TOKEN_EXPIRATION_YEARS=40
|
||||
|
||||
# --------------------------------------------
|
||||
# OPTIONAL: SECURITY HEADER SETTINGS
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -60,3 +60,4 @@ phpmd\.xml
|
||||
_ide_helper.php
|
||||
.phpstorm.meta.php
|
||||
_ide_helper_models.php
|
||||
/.phplint-cache
|
||||
|
||||
80
.travis.yml
80
.travis.yml
@@ -1,80 +0,0 @@
|
||||
addons:
|
||||
code_climate:
|
||||
repo_token:
|
||||
secure: "C/bUAEpwfZB82dkzI2Nxx3PW5w/BzbKkSyCkp6YjT046jD2/QKvz6ngCFlt3tAWV11TXWFI6D8DzkMmdWOrQl3SGlPZXRD8QOvCiz0HiGMDvlxjAaPaQecGaQZdx/H4m6xTUXRNUVaYmxlMgkkFCWhAp+HZDs0iyOEVamp0Jszg="
|
||||
hosts:
|
||||
- localhost
|
||||
sudo: false
|
||||
|
||||
# see http://about.travis-ci.org/docs/user/languages/php/ for more hints
|
||||
language: php
|
||||
|
||||
services:
|
||||
- mysql
|
||||
|
||||
# list any PHP version you want to test against
|
||||
php:
|
||||
- 7.2
|
||||
- 7.3.0
|
||||
- 7.4
|
||||
|
||||
|
||||
# execute any number of scripts before the test run, custom env's are available as variables
|
||||
before_script:
|
||||
- phpenv config-add .github/travis-memory.ini
|
||||
- phantomjs --webdriver=4444 &
|
||||
- sleep 4
|
||||
- mysql -e 'CREATE DATABASE snipeit_unit;'
|
||||
- mysql -e 'CREATE USER "travis'@'localhost";'
|
||||
- mysql -e 'GRANT ALL PRIVILEGES ON * . * TO "travis'@'localhost";'
|
||||
- mysql -e 'FLUSH PRIVILEGES;'
|
||||
- cp .env.testing-ci .env
|
||||
- composer self-update
|
||||
- composer install -n --prefer-source
|
||||
- chmod -R 777 storage
|
||||
- php artisan migrate --env=testing-ci --database=mysql --force
|
||||
- ./vendor/bin/codecept build
|
||||
- php artisan --env=testing-ci key:generate
|
||||
- php artisan --env=testing-ci snipeit:travisci-install
|
||||
- php artisan --env=testing-ci db:seed --database=mysql --force
|
||||
- php artisan --env=testing-ci snipeit:create-admin --first_name=Alison --last_name=Foobar --email=me@example.com --username=snipe --password=password
|
||||
- php artisan --env=testing-ci passport:install
|
||||
- php artisan serve --env=testing-ci --port=8000 --host=localhost &
|
||||
- sleep 5
|
||||
- pip install --user codecov
|
||||
- sleep 5
|
||||
|
||||
|
||||
|
||||
# omitting "script:" will default to phpunit
|
||||
# use the $DB env variable to determine the phpunit.xml to use
|
||||
# script: ./vendor/bin/codecept run --env testing-ci
|
||||
script:
|
||||
- ./vendor/bin/codecept run unit
|
||||
# - ./vendor/bin/codecept run acceptance --env=testing-ci
|
||||
- ./vendor/bin/codecept run functional --env=functional-travis -g func1
|
||||
- ./vendor/bin/codecept run functional --env=functional-travis -g func2
|
||||
- ./vendor/bin/codecept run api --env=functional-travis
|
||||
|
||||
after_script:
|
||||
- vendor/bin/test-reporter
|
||||
|
||||
after_success:
|
||||
- codecov
|
||||
|
||||
after_failure:
|
||||
- cat tests/_output/*.fail.html
|
||||
- curl http://localhost:8000/login
|
||||
- cat storage/logs/laravel.log
|
||||
|
||||
# configure notifications (email, IRC, campfire etc)
|
||||
notifications:
|
||||
email: false
|
||||
slack:
|
||||
secure: vv9we1RxB9RsrMbomSdq6D7vz/okobw87pEkgIZjB+hj1QpQ2by90gsPsOa+NgsJEFaEP7e4KlT6SH8kK+zhbmuKaUd3d1//XdcancE22LZXi6tkiB5yuR/Jhhb1LLDqyGJTB4D92hMnnCPiUjpxNA3r437ttNeYRdYIEEP3drA=
|
||||
webhooks:
|
||||
urls:
|
||||
- https://webhooks.gitter.im/e/5e136eb0c1965f3918d0
|
||||
on_success: change # options: [always|never|change] default: always
|
||||
on_failure: change # options: [always|never|change] default: always
|
||||
on_start: false # default: false
|
||||
15
README.md
15
README.md
@@ -1,13 +1,11 @@
|
||||
[](https://travis-ci.org/snipe/snipe-it) [](https://crowdin.com/project/snipe-it) [](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://hub.docker.com/r/snipe/snipe-it/) [](https://twitter.com/snipeitapp) [](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade)
|
||||
[](#contributors) [](https://www.codetriage.com/snipe/snipe-it)
|
||||
[](#contributors) [](https://www.codetriage.com/snipe/snipe-it)
|
||||
|
||||
 [](https://crowdin.com/project/snipe-it) [](https://gitter.im/snipe/snipe-it?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://hub.docker.com/r/snipe/snipe-it/) [](https://twitter.com/snipeitapp) [](https://www.codacy.com/app/snipe/snipe-it?utm_source=github.com&utm_medium=referral&utm_content=snipe/snipe-it&utm_campaign=Badge_Grade)
|
||||
[](#contributors)
|
||||
|
||||
## Snipe-IT - Open Source Asset Management System
|
||||
|
||||
This is a FOSS project for asset management in IT Operations. Knowing who has which laptop, when it was purchased in order to depreciate it correctly, handling software licenses, etc.
|
||||
|
||||
It is built on [Laravel 5.5](http://laravel.com).
|
||||
It is built on [Laravel 6](http://laravel.com).
|
||||
|
||||
Snipe-IT is actively developed and we [release quite frequently](https://github.com/snipe/snipe-it/releases). ([Check out the live demo here](https://snipeitapp.com/demo/).)
|
||||
|
||||
@@ -64,7 +62,8 @@ Since the release of the JSON REST API, several third-party developers have been
|
||||
- [Snipe-IT plugin for Jira Service Desk (beta)](https://marketplace.atlassian.com/apps/1220379/snipe-it-for-jira-service-desk-beta?hosting=cloud&tab=overview) - for the upcoming Snipe-IT v5 only
|
||||
- [Python 3 CSV importer](https://github.com/gastamper/snipeit-csvimporter) - allows importing assets into Snipe-IT based on Item Name rather than Asset Tag.
|
||||
- [Snipe-IT Kubernetes Helm Chart](https://github.com/t3n/helm-charts/tree/master/snipeit) - For more information, [click here](https://hub.helm.sh/charts/t3n/snipeit).
|
||||
|
||||
- [Snipe-IT Bulk Edit](https://github.com/bricelabelle/snipe-it-bulkedit) - Google Script files to use Google Sheets as a bulk checkout/checkin/edit tool for Snipe-it.
|
||||
|
||||
As these were created by third-parties, Snipe-IT cannot provide support for these project, and you should contact the developers directly if you need assistance. Additionally, Snipe-IT makes no guarantees as to the reliability, accuracy or maintainability of these libraries. Use at your own risk. :)
|
||||
|
||||
-----
|
||||
@@ -115,14 +114,12 @@ Thanks goes to all of these wonderful people ([emoji key](https://github.com/ken
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/982885?v=4" width="110px;"/><br /><sub>Martin Stub</sub>](http://martinstub.dk)<br />[🌍](#translation-stubben "Translation") | [<img src="https://avatars2.githubusercontent.com/u/28959963?v=4" width="110px;"/><br /><sub>Meyer Flavio</sub>](https://github.com/meyerf99)<br />[🌍](#translation-meyerf99 "Translation") | [<img src="https://avatars3.githubusercontent.com/u/796443?v=4" width="110px;"/><br /><sub>Micael Rodrigues</sub>](https://github.com/MicaelRodrigues)<br />[🌍](#translation-MicaelRodrigues "Translation") | [<img src="https://avatars0.githubusercontent.com/u/10481331?v=4" width="110px;"/><br /><sub>Mikael Rasmussen</sub>](http://rubixy.com/)<br />[🌍](#translation-mikaelssen "Translation") | [<img src="https://avatars1.githubusercontent.com/u/1544552?v=4" width="110px;"/><br /><sub>IxFail</sub>](https://github.com/IxFail)<br />[🌍](#translation-IxFail "Translation") | [<img src="https://avatars3.githubusercontent.com/u/18483118?v=4" width="110px;"/><br /><sub>Mohammed Fota</sub>](http://www.mohammedfota.com)<br />[🌍](#translation-MohammedFota "Translation") | [<img src="https://avatars0.githubusercontent.com/u/227080?v=4" width="110px;"/><br /><sub>Moayad Alserihi</sub>](https://github.com/omego)<br />[🌍](#translation-omego "Translation") |
|
||||
| [<img src="https://avatars0.githubusercontent.com/u/1680266?v=4" width="110px;"/><br /><sub>saymd</sub>](https://github.com/saymd)<br />[🌍](#translation-saymd "Translation") | [<img src="https://avatars0.githubusercontent.com/u/1826808?v=4" width="110px;"/><br /><sub>Patrik Larsson</sub>](https://nordsken.se)<br />[🌍](#translation-pooot "Translation") | [<img src="https://avatars1.githubusercontent.com/u/20584746?v=4" width="110px;"/><br /><sub>drcryo</sub>](https://github.com/drcryo)<br />[🌍](#translation-drcryo "Translation") | [<img src="https://avatars1.githubusercontent.com/u/19408004?v=4" width="110px;"/><br /><sub>pawel1615</sub>](https://github.com/pawel1615)<br />[🌍](#translation-pawel1615 "Translation") | [<img src="https://avatars2.githubusercontent.com/u/23340468?v=4" width="110px;"/><br /><sub>bodrovics</sub>](https://github.com/bodrovics)<br />[🌍](#translation-bodrovics "Translation") | [<img src="https://avatars0.githubusercontent.com/u/3257654?v=4" width="110px;"/><br /><sub>priatna</sub>](https://github.com/priatna)<br />[🌍](#translation-priatna "Translation") | [<img src="https://avatars1.githubusercontent.com/u/5358374?v=4" width="110px;"/><br /><sub>Fan Jiang</sub>](https://amayume.net)<br />[🌍](#translation-ProfFan "Translation") |
|
||||
| [<img src="https://avatars1.githubusercontent.com/u/22555451?v=4" width="110px;"/><br /><sub>ragnarcx</sub>](https://github.com/ragnarcx)<br />[🌍](#translation-ragnarcx "Translation") | [<img src="https://avatars2.githubusercontent.com/u/18654582?v=4" width="110px;"/><br /><sub>Rein van Haaren</sub>](http://www.reinvanhaaren.nl/)<br />[🌍](#translation-reinvanhaaren "Translation") | [<img src="https://avatars1.githubusercontent.com/u/386672?v=4" width="110px;"/><br /><sub>Teguh Dwicaksana</sub>](http://dheche.songolimo.net)<br />[🌍](#translation-dheche "Translation") | [<img src="https://avatars2.githubusercontent.com/u/2572552?v=4" width="110px;"/><br /><sub>fraccie</sub>](https://github.com/FRaccie)<br />[🌍](#translation-FRaccie "Translation") | [<img src="https://avatars0.githubusercontent.com/u/35182720?v=4" width="110px;"/><br /><sub>vinzruzell</sub>](https://github.com/vinzruzell)<br />[🌍](#translation-vinzruzell "Translation") | [<img src="https://avatars1.githubusercontent.com/u/7883603?v=4" width="110px;"/><br /><sub>Kevin Austin</sub>](http://kevinaustin.com)<br />[🌍](#translation-vipsystem "Translation") | [<img src="https://avatars3.githubusercontent.com/u/3861828?v=4" width="110px;"/><br /><sub>Wira Sandy</sub>](http://azuraweb.xyz)<br />[🌍](#translation-wira-sandy "Translation") |
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/8663789?v=4" width="110px;"/><br /><sub>Илья</sub>](https://github.com/GrayHoax)<br />[🌍](#translation-GrayHoax "Translation") | [<img src="https://avatars3.githubusercontent.com/u/30119111?v=4" width="110px;"/><br /><sub>GodUseVPN</sub>](https://github.com/godusevpn)<br />[🌍](#translation-godusevpn "Translation") | [<img src="https://avatars1.githubusercontent.com/u/745576?v=4" width="110px;"/><br /><sub>周周</sub>](https://github.com/EngrZhou)<br />[🌍](#translation-EngrZhou "Translation") | [<img src="https://avatars3.githubusercontent.com/u/1631095?v=4" width="110px;"/><br /><sub>Sam</sub>](https://github.com/takuy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=takuy "Code") | [<img src="https://avatars1.githubusercontent.com/u/264022?v=4" width="110px;"/><br /><sub>Azerothian</sub>](https://www.illisian.com.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Azerothian "Code") | [<img src="https://avatars1.githubusercontent.com/u/7632599?v=4" width="110px;"/><br /><sub>Tim Farmer</sub>](https://github.com/timothyfarmer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=timothyfarmer "Code") | [<img src="https://avatars0.githubusercontent.com/u/17459600?v=4" width="110px;"/><br /><sub>Marián Skrip</sub>](https://github.com/mskrip)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mskrip "Code") |
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/47435081?v=4" width="110px;"/><br /><sub>Godfrey Martinez</sub>](https://github.com/Godmartinz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Godmartinz "Code") | [<img src="https://avatars1.githubusercontent.com/u/2075128?v=4" width="110px;"/><br /><sub>bigtreeEdo</sub>](https://github.com/bigtreeEdo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bigtreeEdo "Code") | [<img src="https://avatars0.githubusercontent.com/u/5000430?v=4" width="110px;"/><br /><sub>Colin McNeil</sub>](https://colinmcneil.me/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ColinMcNeil "Code") | [<img src="https://avatars0.githubusercontent.com/u/421625?v=4" width="110px;"/><br /><sub>JoKneeMo</sub>](https://github.com/JoKneeMo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JoKneeMo "Code") | [<img src="https://avatars0.githubusercontent.com/u/54849013?v=4" width="110px;"/><br /><sub>Joshi</sub>](http://www.redbridge.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=joshi-redbridge "Code") | [<img src="https://avatars2.githubusercontent.com/u/15731458?v=4" width="110px;"/><br /><sub>Anthony Burns</sub>](https://github.com/anthonypburns)<br />[💻](https://github.com/snipe/snipe-it/commits?author=anthonypburns "Code") | [<img src="https://avatars2.githubusercontent.com/u/1972329?v=4" width="110px;"/><br /><sub>Alexander Chibrikin</sub>](http://phpprofi.ru/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=alek13 "Code") |
|
||||
| [<img src="https://avatars2.githubusercontent.com/u/8663789?v=4" width="110px;"/><br /><sub>Илья</sub>](https://github.com/GrayHoax)<br />[🌍](#translation-GrayHoax "Translation") | [<img src="https://avatars3.githubusercontent.com/u/30119111?v=4" width="110px;"/><br /><sub>GodUseVPN</sub>](https://github.com/godusevpn)<br />[🌍](#translation-godusevpn "Translation") | [<img src="https://avatars1.githubusercontent.com/u/745576?v=4" width="110px;"/><br /><sub>周周</sub>](https://github.com/EngrZhou)<br />[🌍](#translation-EngrZhou "Translation") | [<img src="https://avatars3.githubusercontent.com/u/1631095?v=4" width="110px;"/><br /><sub>Sam</sub>](https://github.com/takuy)<br />[💻](https://github.com/snipe/snipe-it/commits?author=takuy "Code") | [<img src="https://avatars1.githubusercontent.com/u/264022?v=4" width="110px;"/><br /><sub>Azerothian</sub>](https://www.illisian.com.au)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Azerothian "Code") | [<img src="https://avatars1.githubusercontent.com/u/4930051?v=4" width="110px;"/><br /><sub>Wes Hulette</sub>](http://macfoo.wordpress.com/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jwhulette "Code") | [<img src="https://avatars0.githubusercontent.com/u/8134591?v=4" width="110px;"/><br /><sub>patrict</sub>](https://github.com/patrict)<br />[💻](https://github.com/snipe/snipe-it/commits?author=patrict "Code") |
|
||||
| [<img src="https://avatars3.githubusercontent.com/u/2611616?v=4" width="110px;"/><br /><sub>Dmitriy Minaev</sub>](https://github.com/VELIKII-DIVAN)<br />[💻](https://github.com/snipe/snipe-it/commits?author=VELIKII-DIVAN "Code") | [<img src="https://avatars0.githubusercontent.com/u/5132245?v=4" width="110px;"/><br /><sub>liquidhorse</sub>](https://github.com/liquidhorse)<br />[💻](https://github.com/snipe/snipe-it/commits?author=liquidhorse "Code") | [<img src="https://avatars1.githubusercontent.com/u/183678?v=4" width="110px;"/><br /><sub>Jordi Boggiano</sub>](https://seld.be/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Seldaek "Code") | [<img src="https://avatars0.githubusercontent.com/u/653557?v=4" width="110px;"/><br /><sub>Ivan Nieto</sub>](https://github.com/inietov)<br />[💻](https://github.com/snipe/snipe-it/commits?author=inietov "Code") | [<img src="https://avatars2.githubusercontent.com/u/6764151?v=4" width="110px;"/><br /><sub>Ben RUBSON</sub>](https://github.com/benrubson)<br />[💻](https://github.com/snipe/snipe-it/commits?author=benrubson "Code") | [<img src="https://avatars2.githubusercontent.com/u/8554558?v=4" width="110px;"/><br /><sub>NMathar</sub>](https://github.com/NMathar)<br />[💻](https://github.com/snipe/snipe-it/commits?author=NMathar "Code") | [<img src="https://avatars1.githubusercontent.com/u/139566?v=4" width="110px;"/><br /><sub>Steffen</sub>](https://github.com/smb)<br />[💻](https://github.com/snipe/snipe-it/commits?author=smb "Code") |
|
||||
| [<img src="https://avatars0.githubusercontent.com/u/6609453?v=4" width="110px;"/><br /><sub>Sxderp</sub>](https://github.com/Sxderp)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Sxderp "Code") | [<img src="https://avatars1.githubusercontent.com/u/4807843?v=4" width="110px;"/><br /><sub>fanta8897</sub>](https://github.com/fanta8897)<br />[💻](https://github.com/snipe/snipe-it/commits?author=fanta8897 "Code") | [<img src="https://avatars2.githubusercontent.com/u/2576509?v=4" width="110px;"/><br /><sub>Andrey Bolonin</sub>](https://andreybolonin.com/phpconsulting/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=andreybolonin "Code") | [<img src="https://avatars3.githubusercontent.com/u/2173307?v=4" width="110px;"/><br /><sub>shinayoshi</sub>](http://www.shinayoshi.net/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=shinayoshi "Code") | [<img src="https://avatars3.githubusercontent.com/u/2130159?v=4" width="110px;"/><br /><sub>Hubert</sub>](https://github.com/reuser)<br />[💻](https://github.com/snipe/snipe-it/commits?author=reuser "Code") | [<img src="https://avatars0.githubusercontent.com/u/6865789?v=4" width="110px;"/><br /><sub>KeenRivals</sub>](https://brashear.me)<br />[💻](https://github.com/snipe/snipe-it/commits?author=KeenRivals "Code") | [<img src="https://avatars3.githubusercontent.com/u/2902513?v=4" width="110px;"/><br /><sub>omyno</sub>](https://github.com/omyno)<br />[💻](https://github.com/snipe/snipe-it/commits?author=omyno "Code") |
|
||||
| [<img src="https://avatars1.githubusercontent.com/u/6271335?v=4" width="110px;"/><br /><sub>Evgeny</sub>](https://github.com/jackka)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jackka "Code") | [<img src="https://avatars2.githubusercontent.com/u/1169963?v=4" width="110px;"/><br /><sub>Colin Campbell</sub>](https://digitalist.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=colin-campbell "Code") | [<img src="https://avatars3.githubusercontent.com/u/2872098?v=4" width="110px;"/><br /><sub>Ľubomír Kučera</sub>](https://github.com/lubo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=lubo "Code") | [<img src="https://avatars3.githubusercontent.com/u/570639?v=4" width="110px;"/><br /><sub>Martin Meredith</sub>](https://www.sourceguru.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Mezzle "Code") | [<img src="https://avatars1.githubusercontent.com/u/7632599?v=4" width="110px;"/><br /><sub>Tim Farmer</sub>](https://github.com/timothyfarmer)<br />[💻](https://github.com/snipe/snipe-it/commits?author=timothyfarmer "Code") | [<img src="https://avatars0.githubusercontent.com/u/17459600?v=4" width="110px;"/><br /><sub>Marián Skrip</sub>](https://github.com/mskrip)<br />[💻](https://github.com/snipe/snipe-it/commits?author=mskrip "Code") | [<img src="https://avatars2.githubusercontent.com/u/47435081?v=4" width="110px;"/><br /><sub>Godfrey Martinez</sub>](https://github.com/Godmartinz)<br />[💻](https://github.com/snipe/snipe-it/commits?author=Godmartinz "Code") |
|
||||
| [<img src="https://avatars1.githubusercontent.com/u/2075128?v=4" width="110px;"/><br /><sub>bigtreeEdo</sub>](https://github.com/bigtreeEdo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=bigtreeEdo "Code") | [<img src="https://avatars0.githubusercontent.com/u/5000430?v=4" width="110px;"/><br /><sub>Colin McNeil</sub>](https://colinmcneil.me/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=ColinMcNeil "Code") | [<img src="https://avatars0.githubusercontent.com/u/421625?v=4" width="110px;"/><br /><sub>JoKneeMo</sub>](https://github.com/JoKneeMo)<br />[💻](https://github.com/snipe/snipe-it/commits?author=JoKneeMo "Code") | [<img src="https://avatars0.githubusercontent.com/u/54849013?v=4" width="110px;"/><br /><sub>Joshi</sub>](http://www.redbridge.se)<br />[💻](https://github.com/snipe/snipe-it/commits?author=joshi-redbridge "Code") | [<img src="https://avatars2.githubusercontent.com/u/15731458?v=4" width="110px;"/><br /><sub>Anthony Burns</sub>](https://github.com/anthonypburns)<br />[💻](https://github.com/snipe/snipe-it/commits?author=anthonypburns "Code") | [<img src="https://avatars1.githubusercontent.com/u/63399474?v=4" width="110px;"/><br /><sub>johnson-yi</sub>](https://github.com/johnson-yi)<br />[💻](https://github.com/snipe/snipe-it/commits?author=johnson-yi "Code") | [<img src="https://avatars1.githubusercontent.com/u/1862720?v=4" width="110px;"/><br /><sub>Sanjay Govind</sub>](https://tangentmc.net)<br />[💻](https://github.com/snipe/snipe-it/commits?author=sanjay900 "Code") |
|
||||
| [<img src="https://avatars0.githubusercontent.com/u/1255375?v=4" width="110px;"/><br /><sub>Peter Upfold</sub>](https://peter.upfold.org.uk/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PeterUpfold "Code") | [<img src="https://avatars2.githubusercontent.com/u/961717?v=4" width="110px;"/><br /><sub>Jared Biel</sub>](https://github.com/jbiel)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jbiel "Code") |
|
||||
| [<img src="https://avatars0.githubusercontent.com/u/1255375?v=4" width="110px;"/><br /><sub>Peter Upfold</sub>](https://peter.upfold.org.uk/)<br />[💻](https://github.com/snipe/snipe-it/commits?author=PeterUpfold "Code") | [<img src="https://avatars2.githubusercontent.com/u/961717?v=4" width="110px;"/><br /><sub>Jared Biel</sub>](https://github.com/jbiel)<br />[💻](https://github.com/snipe/snipe-it/commits?author=jbiel "Code") | [<img src="https://avatars1.githubusercontent.com/u/1733625?v=4" width="110px;"/><br /><sub>Dampfklon</sub>](https://github.com/dampfklon)<br />[💻](https://github.com/snipe/snipe-it/commits?author=dampfklon "Code") | [<img src="https://avatars2.githubusercontent.com/u/52973156?v=4" width="110px;"/><br /><sub>Charles Hamilton</sub>](https://communityclosing.com)<br />[💻](https://github.com/snipe/snipe-it/commits?author=chamilton-ccn "Code") |
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!
|
||||
|
||||
105
app/Console/Commands/FixMismatchedAssetsAndLogs.php
Normal file
105
app/Console/Commands/FixMismatchedAssetsAndLogs.php
Normal file
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Actionlog;
|
||||
use App\Models\Asset;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class FixMismatchedAssetsAndLogs extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'snipeit:fix-assets-and-logs {--dryrun : Run the sync process but don\'t update the database}';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'This script attempts to check the log table and check that the assets.assigned_to matches the last checkout.';
|
||||
|
||||
/**
|
||||
* Is dry-run?
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $dryrun = false;
|
||||
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
|
||||
if ($this->option('dryrun')) {
|
||||
$this->dryrun = true;
|
||||
}
|
||||
|
||||
if ($this->dryrun) {
|
||||
$this->info('This is a DRY RUN - no changes will be saved.' );
|
||||
}
|
||||
|
||||
$mismatch_count = 0;
|
||||
$assets = Asset::whereNotNull('assigned_to')
|
||||
->where('assigned_type', '=', 'App\\Models\\User')
|
||||
->orderBy('id', 'ASC')->get();
|
||||
foreach ($assets as $asset) {
|
||||
|
||||
// get the last checkout of the asset
|
||||
if ($checkout_log = Actionlog::where('target_type', '=', 'App\\Models\\User')
|
||||
->where('action_type', '=', 'checkout')
|
||||
->where('item_id', '=', $asset->id)
|
||||
->orderBy('created_at', 'DESC')
|
||||
->first()) {
|
||||
|
||||
// Now check for a subsequent checkin log - we want to ignore those
|
||||
if (!$checkin_log = Actionlog::where('target_type', '=', 'App\\Models\\User')
|
||||
->where('action_type', '=', 'checkin from')
|
||||
->where('item_id', '=', $asset->id)
|
||||
->whereDate('created_at', '>', $checkout_log->created_at)
|
||||
->orderBy('created_at', 'DESC')
|
||||
->first()) {
|
||||
|
||||
//print_r($asset);
|
||||
if ($checkout_log->target_id != $asset->assigned_to) {
|
||||
$this->error('Log ID: '.$checkout_log->id.' -- Asset ID '. $checkout_log->item_id.' SHOULD BE checked out to User '.$checkout_log->target_id.' but its assigned_to is '.$asset->assigned_to );
|
||||
|
||||
if (!$this->dryrun) {
|
||||
$asset->assigned_to = $checkout_log->target_id;
|
||||
if ($asset->save()) {
|
||||
$this->info('Asset record updated.');
|
||||
} else {
|
||||
$this->error('Error updating asset: '.$asset->getErrors());
|
||||
}
|
||||
}
|
||||
$mismatch_count++;
|
||||
}
|
||||
} else {
|
||||
//$this->info('Asset ID '.$asset->id.': There is a checkin '.$checkin_log->created_at.' after this checkout '.$checkout_log->created_at);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
$this->info($mismatch_count.' mismatched assets.');
|
||||
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,10 @@ class MergeUsersByUsername extends Command
|
||||
foreach ($bad_user->assets as $asset) {
|
||||
$this->info( 'Updating asset '.$asset->asset_tag.' '.$asset->id.' to user '.$user->id);
|
||||
$asset->assigned_to = $user->id;
|
||||
$asset->save();
|
||||
if (!$asset->save()) {
|
||||
$this->error( 'Could not update assigned_to field on asset '.$asset->asset_tag.' '.$asset->id.' to user '.$user->id);
|
||||
$this->error( 'Error saving: '.$asset->getErrors());
|
||||
}
|
||||
}
|
||||
|
||||
// Walk the list of licenses
|
||||
|
||||
@@ -47,33 +47,33 @@ class MoveUploadsToNewDisk extends Command
|
||||
}
|
||||
$delete_local = $this->argument('delete_local');
|
||||
|
||||
$public_uploads['accessories'] = glob('storage/app/public/accessories'."/*.*");
|
||||
$public_uploads['assets'] = glob('storage/app/public/assets'."/*.*");
|
||||
$public_uploads['avatars'] = glob('storage/app/public/avatars'."/*.*");
|
||||
$public_uploads['categories'] = glob('storage/app/public/categories'."/*.*");
|
||||
$public_uploads['companies'] = glob('storage/app/public/companies'."/*.*");
|
||||
$public_uploads['components'] = glob('storage/app/public/components'."/*.*");
|
||||
$public_uploads['consumables'] = glob('storage/app/public/consumables'."/*.*");
|
||||
$public_uploads['departments'] = glob('storage/app/public/departments'."/*.*");
|
||||
$public_uploads['locations'] = glob('storage/app/public/locations'."/*.*");
|
||||
$public_uploads['manufacturers'] = glob('storage/app/public/manufacturers'."/*.*");
|
||||
$public_uploads['suppliers'] = glob('storage/app/public/suppliers'."/*.*");
|
||||
$public_uploads['assetmodels'] = glob('storage/app/public/models'."/*.*");
|
||||
$public_uploads['accessories'] = glob('public/accessories'."/*.*");
|
||||
$public_uploads['assets'] = glob('public/assets'."/*.*");
|
||||
$public_uploads['avatars'] = glob('public/avatars'."/*.*");
|
||||
$public_uploads['categories'] = glob('public/categories'."/*.*");
|
||||
$public_uploads['companies'] = glob('public/companies'."/*.*");
|
||||
$public_uploads['components'] = glob('public/components'."/*.*");
|
||||
$public_uploads['consumables'] = glob('public/consumables'."/*.*");
|
||||
$public_uploads['departments'] = glob('public/departments'."/*.*");
|
||||
$public_uploads['locations'] = glob('public/locations'."/*.*");
|
||||
$public_uploads['manufacturers'] = glob('public/manufacturers'."/*.*");
|
||||
$public_uploads['suppliers'] = glob('public/suppliers'."/*.*");
|
||||
$public_uploads['assetmodels'] = glob('public/models'."/*.*");
|
||||
|
||||
|
||||
// iterate files
|
||||
foreach($public_uploads as $public_type => $public_upload)
|
||||
{
|
||||
$type_count = 0;
|
||||
$this->info("\nThere are ".count($public_upload).' PUBLIC '.$public_type.' files.');
|
||||
$this->info("- There are ".count($public_upload).' PUBLIC '.$public_type.' files.');
|
||||
|
||||
for ($i = 0; $i < count($public_upload); $i++) {
|
||||
$type_count++;
|
||||
$filename = basename($public_upload[$i]);
|
||||
|
||||
try {
|
||||
Storage::disk('public')->put($public_type.'/'.$filename, file_get_contents($public_upload[$i]));
|
||||
$new_url = Storage::disk('public')->url($public_type.'/'.$filename, $filename);
|
||||
Storage::disk('public')->put('uploads/'.public_type.'/'.$filename, file_get_contents($public_upload[$i]));
|
||||
$new_url = Storage::disk('public')->url('uploads/'.$public_type.'/'.$filename, $filename);
|
||||
$this->info($type_count.'. PUBLIC: '.$filename.' was copied to '.$new_url);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug($e);
|
||||
@@ -84,15 +84,16 @@ class MoveUploadsToNewDisk extends Command
|
||||
|
||||
}
|
||||
|
||||
$logos = glob('public/uploads'."/setting*.*");
|
||||
$this->info("\nThere are ".count($logos).' files that might be logos.');
|
||||
$logos = glob("public/uploads/setting*.*");
|
||||
$this->info("- There are ".count($logos).' files that might be logos.');
|
||||
$type_count = 0;
|
||||
|
||||
for ($l = 0; $l < count($logos); $l++) {
|
||||
foreach ($logos as $logo) {
|
||||
$this->info($logo);
|
||||
$type_count++;
|
||||
$filename = basename($logos[$l]);
|
||||
$new_url = Storage::disk('public')->url($logos[$l], file_get_contents($public_upload[$i]));
|
||||
$this->info($type_count.'. LOGO: '.$filename.' was copied to '.$new_url);
|
||||
$filename = basename($logo);
|
||||
Storage::disk('public')->put('uploads/'.$filename, file_get_contents($logo));
|
||||
$this->info($type_count.'. LOGO: '.$filename.' was copied to '.env('PUBLIC_AWS_URL').'/uploads/'.$filename);
|
||||
}
|
||||
|
||||
$private_uploads['assets'] = glob('storage/private_uploads/assets'."/*.*");
|
||||
@@ -107,8 +108,7 @@ class MoveUploadsToNewDisk extends Command
|
||||
|
||||
foreach($private_uploads as $private_type => $private_upload)
|
||||
{
|
||||
$this->info("\nThere are ".count($private_upload).' PRIVATE '.$private_type.' files.');
|
||||
// $this->info(print_r($private_upload, true));
|
||||
$this->info("- There are ".count($private_upload).' PRIVATE '.$private_type.' files.');
|
||||
|
||||
$type_count = 0;
|
||||
for ($x = 0; $x < count($private_upload); $x++) {
|
||||
@@ -116,7 +116,7 @@ class MoveUploadsToNewDisk extends Command
|
||||
$filename = basename($private_upload[$x]);
|
||||
|
||||
try {
|
||||
Storage::disk('private_uploads')->put($private_type.'/'.$filename, file_get_contents($public_upload[$i]));
|
||||
Storage::put($private_type.'/'.$filename, file_get_contents($private_upload[$i]));
|
||||
$new_url = Storage::url($private_type.'/'.$filename, $filename);
|
||||
$this->info($type_count.'. PRIVATE: '.$filename.' was copied to '.$new_url);
|
||||
|
||||
|
||||
@@ -55,8 +55,10 @@ class ObjectImportCommand extends Command
|
||||
->setShouldNotify($this->option('send-welcome'))
|
||||
->setUsernameFormat($this->option('username_format'));
|
||||
|
||||
$logFile = $this->option('logfile');
|
||||
\Log::useFiles($logFile);
|
||||
|
||||
// This $logFile/useFiles() bit is currently broken, so commenting it out for now
|
||||
// $logFile = $this->option('logfile');
|
||||
// \Log::useFiles($logFile);
|
||||
$this->comment('======= Importing Items from '.$filename.' =========');
|
||||
$importer->import();
|
||||
|
||||
|
||||
44
app/Console/Commands/PurgeLoginAttempts.php
Normal file
44
app/Console/Commands/PurgeLoginAttempts.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class PurgeLoginAttempts extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'snipeit:purge-logins';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Clears the login_attempts table';
|
||||
|
||||
/**
|
||||
* Create a new command instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
if ($this->confirm("\n****************************************************\nTHIS WILL DELETE ALL OF THE YOUR LOGIN ATTEMPT RECORDS. \nThere is NO undo! \n****************************************************\n\nDo you wish to continue? No backsies! [y|N]")) {
|
||||
\DB::statement('delete from login_attempts');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,27 +55,313 @@ class Helper
|
||||
|
||||
/**
|
||||
* Static colors for pie charts.
|
||||
* This is inelegant, and could be refactored later.
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v3.3]
|
||||
* @return Array
|
||||
*/
|
||||
public static function chartColors()
|
||||
public static function defaultChartColors($index = 0)
|
||||
{
|
||||
$colors = [
|
||||
'#f56954',
|
||||
'#00a65a',
|
||||
'#f39c12',
|
||||
'#00c0ef',
|
||||
'#3c8dbc',
|
||||
'#d2d6de',
|
||||
'#3c8dbc',
|
||||
'#3c8dbc',
|
||||
'#3c8dbc',
|
||||
|
||||
"#008941",
|
||||
"#FF4A46",
|
||||
"#006FA6",
|
||||
"#A30059",
|
||||
"#1CE6FF",
|
||||
"#FFDBE5",
|
||||
"#7A4900",
|
||||
"#0000A6",
|
||||
"#63FFAC",
|
||||
"#B79762",
|
||||
"#004D43",
|
||||
"#8FB0FF",
|
||||
"#997D87",
|
||||
"#5A0007",
|
||||
"#809693",
|
||||
"#FEFFE6",
|
||||
"#1B4400",
|
||||
"#4FC601",
|
||||
"#3B5DFF",
|
||||
"#4A3B53",
|
||||
"#FF2F80",
|
||||
"#61615A",
|
||||
"#BA0900",
|
||||
"#6B7900",
|
||||
"#00C2A0",
|
||||
"#FFAA92",
|
||||
"#FF90C9",
|
||||
"#B903AA",
|
||||
"#D16100",
|
||||
"#DDEFFF",
|
||||
"#000035",
|
||||
"#7B4F4B",
|
||||
"#A1C299",
|
||||
"#300018",
|
||||
"#0AA6D8",
|
||||
"#013349",
|
||||
"#00846F",
|
||||
"#372101",
|
||||
"#FFB500",
|
||||
"#C2FFED",
|
||||
"#A079BF",
|
||||
"#CC0744",
|
||||
"#C0B9B2",
|
||||
"#C2FF99",
|
||||
"#001E09",
|
||||
"#00489C",
|
||||
"#6F0062",
|
||||
"#0CBD66",
|
||||
"#EEC3FF",
|
||||
"#456D75",
|
||||
"#B77B68",
|
||||
"#7A87A1",
|
||||
"#788D66",
|
||||
"#885578",
|
||||
"#FAD09F",
|
||||
"#FF8A9A",
|
||||
"#D157A0",
|
||||
"#BEC459",
|
||||
"#456648",
|
||||
"#0086ED",
|
||||
"#886F4C",
|
||||
"#34362D",
|
||||
"#B4A8BD",
|
||||
"#00A6AA",
|
||||
"#452C2C",
|
||||
"#636375",
|
||||
"#A3C8C9",
|
||||
"#FF913F",
|
||||
"#938A81",
|
||||
"#575329",
|
||||
"#00FECF",
|
||||
"#B05B6F",
|
||||
"#8CD0FF",
|
||||
"#3B9700",
|
||||
"#04F757",
|
||||
"#C8A1A1",
|
||||
"#1E6E00",
|
||||
"#7900D7",
|
||||
"#A77500",
|
||||
"#6367A9",
|
||||
"#A05837",
|
||||
"#6B002C",
|
||||
"#772600",
|
||||
"#D790FF",
|
||||
"#9B9700",
|
||||
"#549E79",
|
||||
"#FFF69F",
|
||||
"#201625",
|
||||
"#72418F",
|
||||
"#BC23FF",
|
||||
"#99ADC0",
|
||||
"#3A2465",
|
||||
"#922329",
|
||||
"#5B4534",
|
||||
"#FDE8DC",
|
||||
"#404E55",
|
||||
"#0089A3",
|
||||
"#CB7E98",
|
||||
"#A4E804",
|
||||
"#324E72",
|
||||
"#6A3A4C",
|
||||
"#83AB58",
|
||||
"#001C1E",
|
||||
"#D1F7CE",
|
||||
"#004B28",
|
||||
"#C8D0F6",
|
||||
"#A3A489",
|
||||
"#806C66",
|
||||
"#222800",
|
||||
"#BF5650",
|
||||
"#E83000",
|
||||
"#66796D",
|
||||
"#DA007C",
|
||||
"#FF1A59",
|
||||
"#8ADBB4",
|
||||
"#1E0200",
|
||||
"#5B4E51",
|
||||
"#C895C5",
|
||||
"#320033",
|
||||
"#FF6832",
|
||||
"#66E1D3",
|
||||
"#CFCDAC",
|
||||
"#D0AC94",
|
||||
"#7ED379",
|
||||
"#012C58",
|
||||
"#7A7BFF",
|
||||
"#D68E01",
|
||||
"#353339",
|
||||
"#78AFA1",
|
||||
"#FEB2C6",
|
||||
"#75797C",
|
||||
"#837393",
|
||||
"#943A4D",
|
||||
"#B5F4FF",
|
||||
"#D2DCD5",
|
||||
"#9556BD",
|
||||
"#6A714A",
|
||||
"#001325",
|
||||
"#02525F",
|
||||
"#0AA3F7",
|
||||
"#E98176",
|
||||
"#DBD5DD",
|
||||
"#5EBCD1",
|
||||
"#3D4F44",
|
||||
"#7E6405",
|
||||
"#02684E",
|
||||
"#962B75",
|
||||
"#8D8546",
|
||||
"#9695C5",
|
||||
"#E773CE",
|
||||
"#D86A78",
|
||||
"#3E89BE",
|
||||
"#CA834E",
|
||||
"#518A87",
|
||||
"#5B113C",
|
||||
"#55813B",
|
||||
"#E704C4",
|
||||
"#00005F",
|
||||
"#A97399",
|
||||
"#4B8160",
|
||||
"#59738A",
|
||||
"#FF5DA7",
|
||||
"#F7C9BF",
|
||||
"#643127",
|
||||
"#513A01",
|
||||
"#6B94AA",
|
||||
"#51A058",
|
||||
"#A45B02",
|
||||
"#1D1702",
|
||||
"#E20027",
|
||||
"#E7AB63",
|
||||
"#4C6001",
|
||||
"#9C6966",
|
||||
"#64547B",
|
||||
"#97979E",
|
||||
"#006A66",
|
||||
"#391406",
|
||||
"#F4D749",
|
||||
"#0045D2",
|
||||
"#006C31",
|
||||
"#DDB6D0",
|
||||
"#7C6571",
|
||||
"#9FB2A4",
|
||||
"#00D891",
|
||||
"#15A08A",
|
||||
"#BC65E9",
|
||||
"#FFFFFE",
|
||||
"#C6DC99",
|
||||
"#203B3C",
|
||||
"#671190",
|
||||
"#6B3A64",
|
||||
"#F5E1FF",
|
||||
"#FFA0F2",
|
||||
"#CCAA35",
|
||||
"#374527",
|
||||
"#8BB400",
|
||||
"#797868",
|
||||
"#C6005A",
|
||||
"#3B000A",
|
||||
"#C86240",
|
||||
"#29607C",
|
||||
"#402334",
|
||||
"#7D5A44",
|
||||
"#CCB87C",
|
||||
"#B88183",
|
||||
"#AA5199",
|
||||
"#B5D6C3",
|
||||
"#A38469",
|
||||
"#9F94F0",
|
||||
"#A74571",
|
||||
"#B894A6",
|
||||
"#71BB8C",
|
||||
"#00B433",
|
||||
"#789EC9",
|
||||
"#6D80BA",
|
||||
"#953F00",
|
||||
"#5EFF03",
|
||||
"#E4FFFC",
|
||||
"#1BE177",
|
||||
"#BCB1E5",
|
||||
"#76912F",
|
||||
"#003109",
|
||||
"#0060CD",
|
||||
"#D20096",
|
||||
"#895563",
|
||||
"#29201D",
|
||||
"#5B3213",
|
||||
"#A76F42",
|
||||
"#89412E",
|
||||
"#1A3A2A",
|
||||
"#494B5A",
|
||||
"#A88C85",
|
||||
"#F4ABAA",
|
||||
"#A3F3AB",
|
||||
"#00C6C8",
|
||||
"#EA8B66",
|
||||
"#958A9F",
|
||||
"#BDC9D2",
|
||||
"#9FA064",
|
||||
"#BE4700",
|
||||
"#658188",
|
||||
"#83A485",
|
||||
"#453C23",
|
||||
"#47675D",
|
||||
"#3A3F00",
|
||||
"#061203",
|
||||
"#DFFB71",
|
||||
"#868E7E",
|
||||
"#98D058",
|
||||
"#6C8F7D",
|
||||
"#D7BFC2",
|
||||
"#3C3E6E",
|
||||
"#D83D66",
|
||||
"#2F5D9B",
|
||||
"#6C5E46",
|
||||
"#D25B88",
|
||||
"#5B656C",
|
||||
"#00B57F",
|
||||
"#545C46",
|
||||
"#866097",
|
||||
"#365D25",
|
||||
"#252F99",
|
||||
"#00CCFF",
|
||||
"#674E60",
|
||||
"#FC009C",
|
||||
"#92896B",
|
||||
];
|
||||
return $colors;
|
||||
|
||||
|
||||
|
||||
return $colors[$index];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Increases or decreases the brightness of a color by a percentage of the current brightness.
|
||||
*
|
||||
* @param string $hexCode Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
|
||||
* @param float $adjustPercent A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function adjustBrightness($hexCode, $adjustPercent) {
|
||||
$hexCode = ltrim($hexCode, '#');
|
||||
|
||||
if (strlen($hexCode) == 3) {
|
||||
$hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2];
|
||||
}
|
||||
|
||||
$hexCode = array_map('hexdec', str_split($hexCode, 2));
|
||||
|
||||
foreach ($hexCode as & $color) {
|
||||
$adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
|
||||
$adjustAmount = ceil($adjustableLimit * $adjustPercent);
|
||||
|
||||
$color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
|
||||
}
|
||||
|
||||
return '#' . implode($hexCode);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class LocationsController extends Controller
|
||||
$allowed_columns = [
|
||||
'id','name','address','address2','city','state','country','zip','created_at',
|
||||
'updated_at','manager_id','image',
|
||||
'assigned_assets_count','users_count','assets_count','currency'];
|
||||
'assigned_assets_count','users_count','assets_count','currency','ldap_ou'];
|
||||
|
||||
$locations = Location::with('parent', 'manager', 'children')->select([
|
||||
'locations.id',
|
||||
@@ -42,6 +42,7 @@ class LocationsController extends Controller
|
||||
'locations.created_at',
|
||||
'locations.updated_at',
|
||||
'locations.image',
|
||||
'locations.ldap_ou',
|
||||
'locations.currency'
|
||||
])->withCount('assignedAssets as assigned_assets_count')
|
||||
->withCount('assets as assets_count')
|
||||
|
||||
@@ -15,6 +15,7 @@ use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Notification;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class SettingsController extends Controller
|
||||
{
|
||||
@@ -93,6 +94,51 @@ class SettingsController extends Controller
|
||||
return response()->json($message, 200);
|
||||
}
|
||||
|
||||
public function ldaptestlogin(Request $request, LdapAd $ldap)
|
||||
{
|
||||
|
||||
if (Setting::getSettings()->ldap_enabled!='1') {
|
||||
\Log::debug('LDAP is not enabled. Cannot test.');
|
||||
return response()->json(['message' => 'LDAP is not enabled, cannot test.'], 400);
|
||||
}
|
||||
|
||||
|
||||
$rules = array(
|
||||
'ldaptest_user' => 'required',
|
||||
'ldaptest_password' => 'required'
|
||||
);
|
||||
|
||||
$validator = Validator::make($request->all(), $rules);
|
||||
if ($validator->fails()) {
|
||||
\Log::debug('LDAP Validation test failed.');
|
||||
$validation_errors = implode(' ',$validator->errors()->all());
|
||||
return response()->json(['message' => $validator->errors()->all()], 400);
|
||||
}
|
||||
|
||||
|
||||
\Log::debug('Preparing to test LDAP login');
|
||||
try {
|
||||
DB::beginTransaction(); //this was the easiest way to invoke a full test of an LDAP login without adding new users to the DB (which may not be desired)
|
||||
|
||||
// $results = $ldap->ldap->auth()->attempt($request->input('ldaptest_username'), $request->input('ldaptest_password'), true);
|
||||
// can't do this because that's a protected property.
|
||||
|
||||
$results = $ldap->ldapLogin($request->input('ldaptest_user'), $request->input('ldaptest_password')); // this would normally create a user on success (if they didn't already exist), but for the transaction
|
||||
if($results) {
|
||||
return response()->json(['message' => 'It worked! '. $request->input('ldaptest_user').' successfully binded to LDAP.'], 200);
|
||||
} else {
|
||||
return response()->json(['message' => 'Login Failed. '. $request->input('ldaptest_user').' did not successfully bind to LDAP.'], 400);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug('Connection failed');
|
||||
return response()->json(['message' => $e->getMessage()], 400);
|
||||
} finally {
|
||||
DB::rollBack(); // ALWAYS rollback, whether success or failure
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function slacktest(Request $request)
|
||||
{
|
||||
|
||||
@@ -137,7 +183,7 @@ class SettingsController extends Controller
|
||||
try {
|
||||
Notification::send(Setting::first(), new MailTest());
|
||||
return response()->json(['message' => 'Mail sent to '.config('mail.reply_to.address')], 200);
|
||||
} catch (Exception $e) {
|
||||
} catch (\Exception $e) {
|
||||
return response()->json(['message' => $e->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,25 +167,30 @@ class StatuslabelsController extends Controller
|
||||
{
|
||||
$this->authorize('view', Statuslabel::class);
|
||||
|
||||
$statuslabels = Statuslabel::with('assets')->groupBy('id')->withCount('assets as assets_count')->get();
|
||||
$statuslabels = Statuslabel::with('assets')
|
||||
->groupBy('id')
|
||||
->withCount('assets as assets_count')
|
||||
->get();
|
||||
|
||||
$labels=[];
|
||||
$points=[];
|
||||
$colors=[];
|
||||
$default_color_count = 0;
|
||||
|
||||
foreach ($statuslabels as $statuslabel) {
|
||||
if ($statuslabel->assets_count > 0) {
|
||||
|
||||
$labels[]=$statuslabel->name. ' ('.number_format($statuslabel->assets_count).')';
|
||||
$points[]=$statuslabel->assets_count;
|
||||
|
||||
if ($statuslabel->color!='') {
|
||||
$colors[]=$statuslabel->color;
|
||||
$colors_array[] = $statuslabel->color;
|
||||
} else {
|
||||
$colors_array[] = Helper::defaultChartColors($default_color_count);
|
||||
$default_color_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$colors_array = array_merge($colors, Helper::chartColors());
|
||||
|
||||
$result= [
|
||||
"labels" => $labels,
|
||||
"datasets" => [ [
|
||||
|
||||
@@ -68,7 +68,7 @@ class UsersController extends Controller
|
||||
|
||||
if (($request->filled('deleted')) && ($request->input('deleted')=='true')) {
|
||||
$users = $users->onlyTrashed();
|
||||
} elseif (($request->filled('all')) && ($request->input('deleted')=='true')) {
|
||||
} elseif (($request->filled('all')) && ($request->input('all')=='true')) {
|
||||
$users = $users->withTrashed();
|
||||
}
|
||||
|
||||
|
||||
@@ -100,9 +100,9 @@ class AssetMaintenancesController extends Controller
|
||||
$assetMaintenance = new AssetMaintenance();
|
||||
$assetMaintenance->supplier_id = $request->input('supplier_id');
|
||||
$assetMaintenance->is_warranty = $request->input('is_warranty');
|
||||
$assetMaintenance->cost = e($request->input('cost'));
|
||||
$assetMaintenance->notes = e($request->input('notes'));
|
||||
$asset = Asset::find(e($request->input('asset_id')));
|
||||
$assetMaintenance->cost = $request->input('cost');
|
||||
$assetMaintenance->notes = $request->input('notes');
|
||||
$asset = Asset::find($request->input('asset_id'));
|
||||
|
||||
if ((!Company::isCurrentUserHasAccess($asset)) && ($asset!=null)) {
|
||||
return static::getInsufficientPermissionsRedirect();
|
||||
|
||||
@@ -234,6 +234,7 @@ class LoginController extends Controller
|
||||
|
||||
if ($user = Auth::user()) {
|
||||
$user->last_login = \Carbon::now();
|
||||
$user->activated = 1;
|
||||
$user->save();
|
||||
}
|
||||
// Redirect to the users page
|
||||
|
||||
@@ -53,8 +53,10 @@ class SamlController extends Controller
|
||||
if (empty($metadata)) {
|
||||
return response()->view('errors.403', [], 403);
|
||||
}
|
||||
|
||||
return response($metadata)->header('Content-Type', 'text/xml');
|
||||
|
||||
return response()->streamDownload(function () use ($metadata) {
|
||||
echo $metadata;
|
||||
}, 'snipe-it-metadata.xml', ['Content-Type' => 'text/xml']);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -124,7 +124,7 @@ class ComponentsController extends Controller
|
||||
}
|
||||
$min = $component->numCHeckedOut();
|
||||
$validator = Validator::make($request->all(), [
|
||||
"qty" => "required|numeric|gt:$min"
|
||||
"qty" => "required|numeric|min:$min"
|
||||
]);
|
||||
|
||||
if ($validator->fails()) {
|
||||
|
||||
@@ -39,7 +39,8 @@ class LicenseFilesController extends Controller
|
||||
$upload_success = false;
|
||||
foreach ($request->file('file') as $file) {
|
||||
|
||||
$file_name = 'license-'.date('Y-m-d-His').'-'.$file->getBasename().'.'.$file->getClientOriginalExtension();
|
||||
|
||||
$file_name = 'license-'.$license->id.'-'.str_random(8).'-'.str_slug(basename($file->getClientOriginalName(), '.'.$file->getClientOriginalExtension())).'.'.$file->getClientOriginalExtension();
|
||||
|
||||
|
||||
$upload_success = $file->storeAs('private_uploads/licenses', $file_name);
|
||||
|
||||
@@ -217,6 +217,99 @@ class ReportsController extends Controller
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Exports the activity report to CSV
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v5.0.7]
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function postActivityReport(Request $request)
|
||||
{
|
||||
ini_set('max_execution_time', 12000);
|
||||
$this->authorize('reports.view');
|
||||
|
||||
\Debugbar::disable();
|
||||
$response = new StreamedResponse(function () {
|
||||
|
||||
\Log::debug('Starting streamed response');
|
||||
|
||||
// Open output stream
|
||||
$handle = fopen('php://output', 'w');
|
||||
stream_set_timeout($handle, 2000);
|
||||
|
||||
$header = [
|
||||
trans('general.date'),
|
||||
trans('general.admin'),
|
||||
trans('general.action'),
|
||||
trans('general.type'),
|
||||
trans('general.item'),
|
||||
'To',
|
||||
trans('general.notes'),
|
||||
'Changed',
|
||||
|
||||
];
|
||||
$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
|
||||
\Log::debug('Starting headers: '.$executionTime);
|
||||
fputcsv($handle, $header);
|
||||
$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
|
||||
\Log::debug('Added headers: '.$executionTime);
|
||||
|
||||
$actionlogs = Actionlog::with('item', 'user', 'target','location')
|
||||
->orderBy('created_at', 'DESC')
|
||||
->chunk(20, function($actionlogs) use($handle) {
|
||||
|
||||
$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
|
||||
\Log::debug('Walking results: '.$executionTime);
|
||||
$count = 0;
|
||||
|
||||
foreach ($actionlogs as $actionlog) {
|
||||
|
||||
$count++;
|
||||
$target_name = '';
|
||||
|
||||
if ($actionlog->target) {
|
||||
if ($actionlog->targetType()=='user') {
|
||||
$target_name = $actionlog->target->getFullNameAttribute();
|
||||
} else {
|
||||
$target_name = $actionlog->target->getDisplayNameAttribute();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$row = [
|
||||
$actionlog->created_at,
|
||||
($actionlog->user) ? e($actionlog->user->getFullNameAttribute()) : '',
|
||||
$actionlog->present()->actionType(),
|
||||
e($actionlog->itemType()),
|
||||
($actionlog->itemType()=='user') ? $actionlog->filename : e($actionlog->item->getDisplayNameAttribute()),
|
||||
$target_name,
|
||||
($actionlog->note) ? e($actionlog->note): '',
|
||||
$actionlog->log_meta,
|
||||
];
|
||||
fputcsv($handle, $row);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
// Close the output stream
|
||||
fclose($handle);
|
||||
$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
|
||||
\Log::debug('-- SCRIPT COMPLETED IN '. $executionTime);
|
||||
|
||||
}, 200, [
|
||||
'Content-Type' => 'text/csv',
|
||||
'Content-Disposition'
|
||||
=> 'attachment; filename="activity-report-'.date('Y-m-d-his').'.csv"',
|
||||
]);
|
||||
|
||||
|
||||
return $response;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Displays license report
|
||||
*
|
||||
|
||||
@@ -38,6 +38,7 @@ class Kernel extends HttpKernel
|
||||
\App\Http\Middleware\CheckLocale::class,
|
||||
\App\Http\Middleware\CheckForTwoFactor::class,
|
||||
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
|
||||
\App\Http\Middleware\AssetCountForSidebar::class,
|
||||
],
|
||||
|
||||
'api' => [
|
||||
|
||||
58
app/Http/Middleware/AssetCountForSidebar.php
Normal file
58
app/Http/Middleware/AssetCountForSidebar.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Auth;
|
||||
use App\Models\Asset;
|
||||
use Closure;
|
||||
|
||||
class AssetCountForSidebar
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
try
|
||||
{
|
||||
$total_rtd_sidebar = Asset::RTD()->count();
|
||||
view()->share('total_rtd_sidebar', $total_rtd_sidebar);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug($e);
|
||||
}
|
||||
|
||||
try {
|
||||
$total_deployed_sidebar = Asset::Deployed()->count();
|
||||
view()->share('total_deployed_sidebar', $total_deployed_sidebar);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug($e);
|
||||
}
|
||||
|
||||
try {
|
||||
$total_archived_sidebar = Asset::Archived()->count();
|
||||
view()->share('total_archived_sidebar', $total_archived_sidebar);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug($e);
|
||||
}
|
||||
|
||||
try {
|
||||
$total_pending_sidebar = Asset::Pending()->count();
|
||||
view()->share('total_pending_sidebar', $total_pending_sidebar);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug($e);
|
||||
}
|
||||
|
||||
try {
|
||||
$total_undeployable_sidebar = Asset::Undeployable()->count();
|
||||
view()->share('total_undeployable_sidebar', $total_undeployable_sidebar);
|
||||
} catch (\Exception $e) {
|
||||
\Log::debug($e);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -106,7 +106,7 @@ class SecurityHeaders
|
||||
$csp_policy[] = "connect-src 'self'";
|
||||
$csp_policy[] = "object-src 'none'";
|
||||
$csp_policy[] = "font-src 'self' data:";
|
||||
$csp_policy[] = "img-src 'self' data: ".config('app.url')." https://secure.gravatar.com http://gravatar.com maps.google.com maps.gstatic.com *.googleapis.com";
|
||||
$csp_policy[] = "img-src 'self' data: ".config('app.url')." ".env('PUBLIC_AWS_URL')." https://secure.gravatar.com http://gravatar.com maps.google.com maps.gstatic.com *.googleapis.com";
|
||||
$csp_policy = join(';', $csp_policy);
|
||||
$response->headers->set('Content-Security-Policy', $csp_policy);
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ class AssetFileRequest extends Request
|
||||
{
|
||||
$max_file_size = \App\Helpers\Helper::file_upload_max_size();
|
||||
return [
|
||||
'file.*' => 'required|mimes:png,gif,jpg,svg,jpeg,doc,docx,pdf,txt,zip,rar,xls,lic,xml,rtf|max:'.$max_file_size,
|
||||
'file.*' => 'required|mimes:png,gif,jpg,svg,jpeg,doc,docx,pdf,txt,zip,rar,xls,xlsx,lic,xml,rtf|max:'.$max_file_size,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,22 +70,27 @@ class SettingsSamlRequest extends FormRequest
|
||||
]);
|
||||
|
||||
$csr = openssl_csr_new($dn, $pkey, ['digest_alg' => 'sha256']);
|
||||
|
||||
$x509 = openssl_csr_sign($csr, null, $pkey, 3650, ['digest_alg' => 'sha256']);
|
||||
|
||||
openssl_x509_export($x509, $x509cert);
|
||||
openssl_pkey_export($pkey, $privateKey);
|
||||
if ($csr) {
|
||||
|
||||
$errors = [];
|
||||
while (($error = openssl_error_string() !== false)) {
|
||||
$errors[] = $error;
|
||||
}
|
||||
|
||||
if (!(empty($x509cert) && empty($privateKey))) {
|
||||
$this->merge([
|
||||
'saml_sp_x509cert' => $x509cert,
|
||||
'saml_sp_privatekey' => $privateKey,
|
||||
]);
|
||||
$x509 = openssl_csr_sign($csr, null, $pkey, 3650, ['digest_alg' => 'sha256']);
|
||||
|
||||
openssl_x509_export($x509, $x509cert);
|
||||
openssl_pkey_export($pkey, $privateKey);
|
||||
|
||||
$errors = [];
|
||||
while (($error = openssl_error_string() !== false)) {
|
||||
$errors[] = $error;
|
||||
}
|
||||
|
||||
if (!(empty($x509cert) && empty($privateKey))) {
|
||||
$this->merge([
|
||||
'saml_sp_x509cert' => $x509cert,
|
||||
'saml_sp_privatekey' => $privateKey,
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
$validator->errors()->add('saml_integration', 'openssl.cnf is missing/invalid');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ class LocationsTransformer
|
||||
'assets_count' => (int) $location->assets_count,
|
||||
'users_count' => (int) $location->users_count,
|
||||
'currency' => ($location->currency) ? e($location->currency) : null,
|
||||
'ldap_ou' => ($location->ldap_ou) ? e($location->ldap_ou) : null,
|
||||
'created_at' => Helper::getFormattedDateObject($location->created_at, 'datetime'),
|
||||
'updated_at' => Helper::getFormattedDateObject($location->updated_at, 'datetime'),
|
||||
'parent' => ($location->parent) ? [
|
||||
|
||||
@@ -130,6 +130,8 @@ class Asset extends Depreciable
|
||||
'supplier_id',
|
||||
'warranty_months',
|
||||
'requestable',
|
||||
'last_checkout',
|
||||
'expected_checkin',
|
||||
];
|
||||
|
||||
use Searchable;
|
||||
@@ -232,7 +234,10 @@ class Asset extends Depreciable
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if an asset is available for checkout
|
||||
* Determines if an asset is available for checkout.
|
||||
* This checks to see if the it's checked out to an invalid (deleted) user
|
||||
* OR if the assigned_to and deleted_at fields on the asset are empty AND
|
||||
* that the status is deployable
|
||||
*
|
||||
* @author [A. Gianotto] [<snipe@snipe.net>]
|
||||
* @since [v3.0]
|
||||
@@ -241,9 +246,10 @@ class Asset extends Depreciable
|
||||
public function availableForCheckout()
|
||||
{
|
||||
if (
|
||||
(empty($this->assigned_to)) &&
|
||||
((!$this->assignedTo) && ($this->assetstatus->archived == 0)) ||
|
||||
((empty($this->assigned_to)) &&
|
||||
(empty($this->deleted_at)) &&
|
||||
(($this->assetstatus) && ($this->assetstatus->deployable == 1)))
|
||||
(($this->assetstatus) && ($this->assetstatus->deployable == 1))))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -424,7 +430,7 @@ class Asset extends Depreciable
|
||||
*/
|
||||
public function assignedTo()
|
||||
{
|
||||
return $this->morphTo('assigned', 'assigned_type', 'assigned_to');
|
||||
return $this->morphTo('assigned', 'assigned_type', 'assigned_to')->withTrashed();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -165,6 +165,8 @@ class Category extends SnipeModel
|
||||
return $this->components()->count();
|
||||
case 'consumable':
|
||||
return $this->consumables()->count();
|
||||
case 'license':
|
||||
return $this->licenses()->count();
|
||||
}
|
||||
return '0';
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ class Location extends SnipeModel
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $searchableAttributes = ['name', 'address', 'city', 'state', 'zip', 'created_at'];
|
||||
protected $searchableAttributes = ['name', 'address', 'city', 'state', 'zip', 'created_at', 'ldap_ou'];
|
||||
|
||||
/**
|
||||
* The relations and their attributes that should be included when searching the model.
|
||||
|
||||
@@ -70,6 +70,7 @@ class User extends SnipeModel implements AuthenticatableContract, AuthorizableCo
|
||||
* @var array
|
||||
*/
|
||||
|
||||
// 'username' => 'required|string|min:1|unique:users,username,NULL,id,deleted_at,NULL',
|
||||
protected $rules = [
|
||||
'first_name' => 'required|string|min:1',
|
||||
'username' => 'required|string|min:1|unique_undeleted',
|
||||
|
||||
@@ -111,7 +111,7 @@ class CheckinAccessoryNotification extends Notification
|
||||
];
|
||||
|
||||
return (new SlackMessage)
|
||||
->content(':arrow_down: :keyboard: Accessory Checked In')
|
||||
->content(':arrow_down: :keyboard: '.trans('mail.Accessory_Checkin_Notification'))
|
||||
->from($botname)
|
||||
->attachment(function ($attachment) use ($item, $note, $admin, $fields) {
|
||||
$attachment->title(htmlspecialchars_decode($item->present()->name), $item->present()->viewUrl())
|
||||
@@ -135,7 +135,7 @@ class CheckinAccessoryNotification extends Notification
|
||||
'note' => $this->note,
|
||||
'target' => $this->target,
|
||||
])
|
||||
->subject('Accessory checked in');
|
||||
->subject(trans('mail.Accessory_Checkin_Notification'));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ class CheckinAssetNotification extends Notification
|
||||
];
|
||||
|
||||
return (new SlackMessage)
|
||||
->content(':arrow_down: :computer: Asset Checked In')
|
||||
->content(':arrow_down: :computer: '.trans('mail.Asset_Checkin_Notification'))
|
||||
->from($botname)
|
||||
->attachment(function ($attachment) use ($item, $note, $admin, $fields) {
|
||||
$attachment->title(htmlspecialchars_decode($item->present()->name), $item->present()->viewUrl())
|
||||
@@ -113,7 +113,7 @@ class CheckinAssetNotification extends Notification
|
||||
'fields' => $fields,
|
||||
'expected_checkin' => $this->expected_checkin,
|
||||
])
|
||||
->subject('Asset checked in');
|
||||
->subject(trans('mail.Asset_Checkin_Notification'));
|
||||
|
||||
|
||||
return $message;
|
||||
|
||||
@@ -83,7 +83,7 @@ class CheckinLicenseSeatNotification extends Notification
|
||||
|
||||
|
||||
return (new SlackMessage)
|
||||
->content(':arrow_down: :floppy_disk: License Checked In')
|
||||
->content(':arrow_down: :floppy_disk: '.trans('mail.License_Checkin_Notification'))
|
||||
->from($botname)
|
||||
->attachment(function ($attachment) use ($item, $note, $admin, $fields) {
|
||||
$attachment->title(htmlspecialchars_decode($item->present()->name), $item->present()->viewUrl())
|
||||
@@ -106,7 +106,7 @@ class CheckinLicenseSeatNotification extends Notification
|
||||
'note' => $this->note,
|
||||
'target' => $this->target,
|
||||
])
|
||||
->subject('License checked in');
|
||||
->subject(trans('mail.License_Checkin_Notification'));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class ExpectedCheckinAdminNotification extends Notification
|
||||
[
|
||||
'assets' => $this->assets,
|
||||
])
|
||||
->subject('Expected asset checkin report');
|
||||
->subject(trans('mail.Expected_Checkin_Report'));
|
||||
|
||||
return $message;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
namespace App\Notifications;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use App\Helpers\Helper;
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Notifications\Messages\MailMessage;
|
||||
use Illuminate\Notifications\Notification;
|
||||
@@ -46,16 +46,18 @@ class ExpectedCheckinNotification extends Notification
|
||||
*/
|
||||
public function toMail()
|
||||
{
|
||||
$formatted_due = Carbon::parse($this->params->expected_checkin)->format('D, M j, Y');
|
||||
return (new MailMessage)
|
||||
->error()
|
||||
->subject('Reminder: '.$this->params->present()->name().' checkin deadline approaching')
|
||||
->line('Hi, '.$this->params->assignedto->first_name.' '.$this->params->assignedto->last_name)
|
||||
->greeting('An asset checked out to you is due to be checked back in on '.$formatted_due.'.')
|
||||
->line('Asset: '.$this->params->present()->name())
|
||||
->line('Serial: '.$this->params->serial)
|
||||
->line('Asset Tag: '.$this->params->asset_tag)
|
||||
->action('View Your Assets', route('view-assets'));
|
||||
|
||||
$message = (new MailMessage)->markdown('notifications.markdown.expected-checkin',
|
||||
[
|
||||
'date' => Helper::getFormattedDateObject($this->params->expected_checkin, 'date', false),
|
||||
'asset' => $this->params->present()->name(),
|
||||
'serial' => $this->params->serial,
|
||||
'asset_tag' => $this->params->asset_tag
|
||||
])
|
||||
->subject(trans('mail.Expected_Checkin_Notification', ['name' => $this->params->present()->name()]));
|
||||
|
||||
return $message;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -123,7 +123,16 @@ class LocationPresenter extends Presenter
|
||||
"switchable" => true,
|
||||
"title" => trans('admin/locations/table.country'),
|
||||
"visible" => false,
|
||||
],[
|
||||
],
|
||||
[
|
||||
"field" => "ldap_ou",
|
||||
"searchable" => true,
|
||||
"sortable" => true,
|
||||
"switchable" => true,
|
||||
"title" => trans('admin/locations/table.ldap_ou'),
|
||||
"visible" => false,
|
||||
],
|
||||
[
|
||||
"field" => "manager",
|
||||
"searchable" => false,
|
||||
"sortable" => true,
|
||||
|
||||
@@ -87,8 +87,9 @@ class AuthServiceProvider extends ServiceProvider
|
||||
|
||||
$this->registerPolicies();
|
||||
Passport::routes();
|
||||
Passport::tokensExpireIn(Carbon::now()->addYears(20));
|
||||
Passport::refreshTokensExpireIn(Carbon::now()->addYears(20));
|
||||
Passport::tokensExpireIn(Carbon::now()->addYears(config('passport.expiration_years')));
|
||||
Passport::refreshTokensExpireIn(Carbon::now()->addYears(config('passport.expiration_years')));
|
||||
Passport::personalAccessTokensExpireIn(Carbon::now()->addYears(config('passport.expiration_years')));
|
||||
Passport::withCookieSerialization();
|
||||
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class SamlServiceProvider extends ServiceProvider
|
||||
'uses' => 'Auth\SamlController@login' ]
|
||||
);
|
||||
|
||||
Route::group(['prefix' => 'admin','middleware' => ['auth', 'authorize:superuser']], function () {
|
||||
Route::group(['prefix' => 'admin','middleware' => ['web','auth', 'authorize:superuser']], function () {
|
||||
|
||||
Route::get('saml', ['as' => 'settings.saml.index','uses' => 'SettingsController@getSamlSettings' ]);
|
||||
Route::post('saml', ['as' => 'settings.saml.save','uses' => 'SettingsController@postSamlSettings' ]);
|
||||
|
||||
@@ -49,6 +49,7 @@ class LdapAd extends LdapAdConfiguration
|
||||
'328224', // 0x50220 NORMAL_ACCOUNT, PASSWD_NOT_REQD, SMARTCARD_REQUIRED, DONT_EXPIRE_PASSWORD
|
||||
'4260352',// 0x410200 NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH
|
||||
'1049088',// 0x100200 NORMAL_ACCOUNT, NOT_DELEGATED
|
||||
'1114624',// 0x110200 NORMAL_ACCOUNT, NOT_DELEGATED, DONT_EXPIRE_PASSWORD
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -145,9 +146,17 @@ class LdapAd extends LdapAdConfiguration
|
||||
throw new Exception('Unable to find user in LDAP directory!');
|
||||
}
|
||||
|
||||
return User::where('username', $username)
|
||||
$user = User::where('username', $username)
|
||||
->whereNull('deleted_at')->where('ldap_import', '=', 1)
|
||||
->where('activated', '=', '1')->first();
|
||||
/* Above, I could've just done ->firstOrFail() which would've been cleaner, but it would've been miserable to
|
||||
troubleshoot if it ever came up (giving a really generic and untraceable error message)
|
||||
*/
|
||||
if (!$user) {
|
||||
throw new Exception("User is either deleted, not activated (can't log in), not from LDAP, or can't be found in database");
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -165,7 +174,7 @@ class LdapAd extends LdapAdConfiguration
|
||||
*/
|
||||
public function processUser(AdldapUser $user, ?Collection $defaultLocation=null, ?Collection $mappedLocations=null): ?User
|
||||
{
|
||||
// Only sync active users
|
||||
// Only sync active users <- I think this actually means 'existing', not 'activated/deactivated'
|
||||
if(!$user) {
|
||||
return null;
|
||||
}
|
||||
@@ -177,8 +186,26 @@ class LdapAd extends LdapAdConfiguration
|
||||
$snipeUser['email'] = $user->{$this->ldapSettings['ldap_email']}[0] ?? '';
|
||||
$snipeUser['title'] = $user->getTitle() ?? '';
|
||||
$snipeUser['telephonenumber'] = $user->getTelephoneNumber() ?? '';
|
||||
$snipeUser['location_id'] = $this->getLocationId($user, $defaultLocation, $mappedLocations);
|
||||
$snipeUser['activated'] = $this->getActiveStatus($user);
|
||||
|
||||
/*
|
||||
* $locationId being 'null' means we have no per-OU location information,
|
||||
* but instead of explicitly setting it to null - which would override any admin-generated
|
||||
* location assignments - we just don't set it at all. For a brand new User, the 'default null'
|
||||
* on the column will cover us. For an already existing user, this will not override any
|
||||
* locations that were explicitly chosen by the administrators.
|
||||
*
|
||||
* When syncing with a particular 'default location' in mind, those should still be respected
|
||||
* and it *will* override the administrators previous choices. I think this is a fair compromise.
|
||||
*/
|
||||
$locationId = $this->getLocationId($user, $defaultLocation, $mappedLocations);
|
||||
if ($locationId !== null ) {
|
||||
$snipeUser['location_id'] = $locationId;
|
||||
}
|
||||
|
||||
$activeStatus = $this->getActiveStatus($user);
|
||||
if ($activeStatus !== null) {
|
||||
$snipeUser['activated'] = $activeStatus;
|
||||
}
|
||||
|
||||
return $this->setUserModel($snipeUser);
|
||||
}
|
||||
@@ -208,8 +235,14 @@ class LdapAd extends LdapAdConfiguration
|
||||
$user->employee_num = trim($userInfo['employee_number']);
|
||||
$user->jobtitle = trim($userInfo['title']);
|
||||
$user->phone = trim($userInfo['telephonenumber']);
|
||||
$user->activated = $userInfo['activated'];
|
||||
$user->location_id = $userInfo['location_id'];
|
||||
if(array_key_exists('activated',$userInfo)) {
|
||||
$user->activated = $userInfo['activated'];
|
||||
} else if ( !$user->exists ) { // no 'activated' flag was set or unset, *AND* this user is new - activate by default.
|
||||
$user->activated = 1;
|
||||
}
|
||||
if(array_key_exists('location_id',$userInfo)) {
|
||||
$user->location_id = $userInfo['location_id'];
|
||||
}
|
||||
$user->notes = 'Imported from LDAP';
|
||||
$user->ldap_import = 1;
|
||||
|
||||
@@ -275,6 +308,8 @@ class LdapAd extends LdapAdConfiguration
|
||||
|
||||
/**
|
||||
* Set the active status of the user.
|
||||
* Returns 0 or 1 if the user is deactivated or activated
|
||||
* or returns null if we just don't know
|
||||
*
|
||||
* @author Wes Hulette <jwhulette@gmail.com>
|
||||
*
|
||||
@@ -282,22 +317,45 @@ class LdapAd extends LdapAdConfiguration
|
||||
*
|
||||
* @param \Adldap\Models\User $user
|
||||
*
|
||||
* @return int
|
||||
* @return int (or null)
|
||||
*/
|
||||
private function getActiveStatus(AdldapUser $user): int
|
||||
private function getActiveStatus(AdldapUser $user): ?int
|
||||
{
|
||||
$activeStatus = 0;
|
||||
/*
|
||||
* Check to see if we are connected to an AD server
|
||||
* if so, check the Active Directory User Account Control Flags
|
||||
* If the admin has set their own 'active flag' - respect that instead
|
||||
* (this may work to allow AD users to ignore the built-in UAC stuff that AD does)
|
||||
*/
|
||||
if ($user->hasAttribute($user->getSchema()->userAccountControl())) {
|
||||
if ($user->hasAttribute($user->getSchema()->userAccountControl()) && !$this->ldapSettings['ldap_active_flag']) {
|
||||
\Log::debug('This is AD - userAccountControl is'. $user->getSchema()->userAccountControl());
|
||||
$activeStatus = (in_array($user->getUserAccountControl(), self::AD_USER_ACCOUNT_CONTROL_FLAGS)) ? 1 : 0;
|
||||
} else {
|
||||
// If there is no activated flag, assume this is handled via the OU and activate the users
|
||||
|
||||
// If there is no activated flag, then we can't make any determination about activated/deactivated
|
||||
if (false == $this->ldapSettings['ldap_active_flag']) {
|
||||
$activeStatus = 1;
|
||||
\Log::debug('ldap_active_flag is false - no ldap_active_flag is set');
|
||||
return null;
|
||||
}
|
||||
|
||||
// If there *is* an activated flag, then respect it *only* if it is actually present. If it's not there, ignore it.
|
||||
if (!$user->hasAttribute($this->ldapSettings['ldap_active_flag'])) {
|
||||
return null; // 'active' flag is defined, but does not exist on returned user record. So we don't know if they're active or not.
|
||||
}
|
||||
|
||||
// if $user has the flag *AND* that flag has exactly one value -
|
||||
if ( $user->{$this->ldapSettings['ldap_active_flag']} && count($user->{$this->ldapSettings['ldap_active_flag']}) == 1 ) {
|
||||
|
||||
$active_flag_value = $user->{$this->ldapSettings['ldap_active_flag']}[0];
|
||||
|
||||
// if the value of that flag is case-insensitively the string 'false' or boolean false
|
||||
if ( strcasecmp($active_flag_value, "false") == 0 || $active_flag_value === false ) {
|
||||
return 0; // then make them INACTIVE
|
||||
} else {
|
||||
return 1; // otherwise active
|
||||
}
|
||||
}
|
||||
return 1; // fail 'open' (active) if we have the attribute and it's multivalued or empty; that's weird
|
||||
}
|
||||
|
||||
return $activeStatus;
|
||||
@@ -398,7 +456,7 @@ class LdapAd extends LdapAdConfiguration
|
||||
{
|
||||
/** @var Schema $schema */
|
||||
$schema = new $this->ldapConfig['schema'];
|
||||
return [
|
||||
return array_values(array_filter([
|
||||
$this->ldapSettings['ldap_username_field'],
|
||||
$this->ldapSettings['ldap_fname_field'],
|
||||
$this->ldapSettings['ldap_lname_field'],
|
||||
@@ -409,7 +467,7 @@ class LdapAd extends LdapAdConfiguration
|
||||
$schema->userAccountControl(),
|
||||
$schema->title(),
|
||||
$schema->telephone(),
|
||||
];
|
||||
]));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -439,7 +497,7 @@ class LdapAd extends LdapAdConfiguration
|
||||
public function testLdapAdUserConnection(): void
|
||||
{
|
||||
try {
|
||||
$this->ldap->connect(); //uh, this doesn't seem to exist :/
|
||||
$this->ldap->connect();
|
||||
} catch (\Adldap\Auth\BindException $e) {
|
||||
Log::error($e);
|
||||
throw new Exception('Unable to connect to LDAP directory!');
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace App\Services;
|
||||
use OneLogin\Saml2\Auth as OneLogin_Saml2_Auth;
|
||||
use OneLogin\Saml2\IdPMetadataParser as OneLogin_Saml2_IdPMetadataParser;
|
||||
use OneLogin\Saml2\Settings as OneLogin_Saml2_Settings;
|
||||
use OneLogin\Saml2\Utils as OneLogin_Saml2_Utils;
|
||||
use App\Models\Setting;
|
||||
use App\Models\User;
|
||||
use Exception;
|
||||
@@ -153,6 +154,9 @@ class Saml
|
||||
$this->_enabled = $setting->saml_enabled == '1';
|
||||
|
||||
if ($this->isEnabled()) {
|
||||
//Let onelogin/php-saml know to use 'X-Forwarded-*' headers if it is from a trusted proxy
|
||||
OneLogin_Saml2_Utils::setProxyVars(request()->isFromTrustedProxy());
|
||||
|
||||
data_set($settings, 'sp.entityId', url('/'));
|
||||
data_set($settings, 'sp.assertionConsumerService.url', route('saml.acs'));
|
||||
data_set($settings, 'sp.singleLogoutService.url', route('saml.sls'));
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
"codeception/module-rest": "^1.2",
|
||||
"codeception/module-webdriver": "^1.0",
|
||||
"fzaninotto/faker": "^1.9",
|
||||
"overtrue/phplint": "^2.2",
|
||||
"phpunit/php-token-stream": "^3.1",
|
||||
"phpunit/phpunit": "^8.5",
|
||||
"squizlabs/php_codesniffer": "^3.5",
|
||||
|
||||
114
composer.lock
generated
114
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "3fe8a441e49d1299687346810b350e00",
|
||||
"content-hash": "68cf0fb2c06b12c9f8b58efbca2cd72b",
|
||||
"packages": [
|
||||
{
|
||||
"name": "adldap2/adldap2",
|
||||
@@ -8476,6 +8476,116 @@
|
||||
],
|
||||
"time": "2020-01-17T21:11:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "n98/junit-xml",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cmuench/junit-xml.git",
|
||||
"reference": "7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/cmuench/junit-xml/zipball/7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46",
|
||||
"reference": "7df0dbaf413fcaa1a63ffbcef18654e7a4cceb46",
|
||||
"shasum": ""
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "3.7.*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-0": {
|
||||
"N98\\JUnitXml": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Christian Münch",
|
||||
"email": "c.muench@netz98.de"
|
||||
}
|
||||
],
|
||||
"description": "JUnit XML Document generation library",
|
||||
"support": {
|
||||
"issues": "https://github.com/cmuench/junit-xml/issues",
|
||||
"source": "https://github.com/cmuench/junit-xml/tree/master"
|
||||
},
|
||||
"time": "2013-11-23T13:11:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "overtrue/phplint",
|
||||
"version": "2.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/overtrue/phplint.git",
|
||||
"reference": "dcbb1b9c728de2f05ce6208db7dacb8b3df1c446"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/overtrue/phplint/zipball/dcbb1b9c728de2f05ce6208db7dacb8b3df1c446",
|
||||
"reference": "dcbb1b9c728de2f05ce6208db7dacb8b3df1c446",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-json": "*",
|
||||
"n98/junit-xml": "1.0.0",
|
||||
"php": ">=5.5.9",
|
||||
"symfony/console": "^3.2|^4.0|^5.0",
|
||||
"symfony/finder": "^3.0|^4.0|^5.0",
|
||||
"symfony/process": "^3.3|^4.0|^5.0",
|
||||
"symfony/yaml": "^3.0|^4.0|^5.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"brainmaestro/composer-git-hooks": "^2.7",
|
||||
"friendsofphp/php-cs-fixer": "^2.16",
|
||||
"jakub-onderka/php-console-highlighter": "^0.3.2 || ^0.4"
|
||||
},
|
||||
"bin": [
|
||||
"bin/phplint"
|
||||
],
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"hooks": {
|
||||
"pre-commit": [
|
||||
"composer fix-style"
|
||||
],
|
||||
"pre-push": [
|
||||
"composer check-style"
|
||||
]
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Overtrue\\PHPLint\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "overtrue",
|
||||
"email": "anzhengchao@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "`phplint` is a tool that can speed up linting of php files by running several lint processes at once.",
|
||||
"keywords": [
|
||||
"check",
|
||||
"lint",
|
||||
"phplint",
|
||||
"syntax"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/overtrue/phplint/issues",
|
||||
"source": "https://github.com/overtrue/phplint/tree/2.2.0"
|
||||
},
|
||||
"time": "2020-11-04T23:50:40+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phar-io/manifest",
|
||||
"version": "1.0.3",
|
||||
@@ -9618,5 +9728,5 @@
|
||||
"platform-overrides": {
|
||||
"php": "7.2"
|
||||
},
|
||||
"plugin-api-version": "1.1.0"
|
||||
"plugin-api-version": "2.0.0"
|
||||
}
|
||||
|
||||
@@ -23,6 +23,6 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'method' => env('MAIL_AUTO_EMBED_METHOD', 'base64'),
|
||||
'method' => env('MAIL_AUTO_EMBED_METHOD', 'attachment'),
|
||||
|
||||
];
|
||||
|
||||
@@ -12,4 +12,5 @@ return [
|
||||
*/
|
||||
'private_key' => env('PASSPORT_PRIVATE_KEY'),
|
||||
'public_key' => env('PASSPORT_PUBLIC_KEY'),
|
||||
'expiration_years' => env('API_TOKEN_EXPIRATION_YEARS', 20),
|
||||
];
|
||||
@@ -1,10 +1,10 @@
|
||||
<?php
|
||||
return array (
|
||||
'app_version' => 'v5.0.5',
|
||||
'full_app_version' => 'v5.0.5-52-g63a8535de',
|
||||
'build_version' => '5509',
|
||||
'app_version' => 'v5.0.9',
|
||||
'full_app_version' => 'v5.0.9 - build 5616-973eacf6c3',
|
||||
'build_version' => '5616',
|
||||
'prerelease_version' => '',
|
||||
'hash_version' => 'g63a8535de',
|
||||
'full_hash' => 'v5.0.5-52-g63a8535de',
|
||||
'hash_version' => '973eacf6c3',
|
||||
'full_hash' => 'v5.0.9-87-973eacf6c3',
|
||||
'branch' => 'master',
|
||||
);
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class WidenLicenseSerialField extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('licenses', function (Blueprint $table) {
|
||||
$table->text('serial')->nullable()->default(null)->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('licenses', function (Blueprint $table) {
|
||||
$table->string('serial', 2048)->nullable()->default(null)->change();
|
||||
});
|
||||
}
|
||||
}
|
||||
6
public/css/dist/all.css
vendored
6
public/css/dist/all.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-black-dark.css
vendored
2
public/css/dist/skins/skin-black-dark.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-green-dark.css
vendored
2
public/css/dist/skins/skin-green-dark.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-orange-dark.css
vendored
2
public/css/dist/skins/skin-orange-dark.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-purple-dark.css
vendored
2
public/css/dist/skins/skin-purple-dark.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-red-dark.css
vendored
2
public/css/dist/skins/skin-red-dark.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-red-dark.min.css
vendored
2
public/css/dist/skins/skin-red-dark.min.css
vendored
File diff suppressed because one or more lines are too long
2
public/css/dist/skins/skin-yellow-dark.css
vendored
2
public/css/dist/skins/skin-yellow-dark.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
60
public/js/dist/all.js
vendored
60
public/js/dist/all.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"/js/build/app.js": "/js/build/app.js?id=fc54bb0c7977c14f519b",
|
||||
"/js/build/app.js": "/js/build/app.js?id=648e026d19aa24504e0f",
|
||||
"/css/build/AdminLTE.css": "/css/build/AdminLTE.css?id=59413334823616b81341",
|
||||
"/css/build/app.css": "/css/build/app.css?id=032fd8c3fce99c7fd862",
|
||||
"/css/build/overrides.css": "/css/build/overrides.css?id=0b4aefd7ef0c117ef23a",
|
||||
@@ -7,32 +7,32 @@
|
||||
"/css/dist/skins/skin-red.css": "/css/dist/skins/skin-red.css?id=747948e5f269f64047f7",
|
||||
"/css/dist/skins/skin-contrast.css": "/css/dist/skins/skin-contrast.css?id=d7996d850e8bcdc4e167",
|
||||
"/css/dist/skins/skin-green.css": "/css/dist/skins/skin-green.css?id=eb25d2ec49f730d09431",
|
||||
"/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=8dfcf59850a3f5775b8c",
|
||||
"/css/dist/skins/skin-green-dark.css": "/css/dist/skins/skin-green-dark.css?id=eb4404a7b646ea42e025",
|
||||
"/css/dist/skins/skin-black.css": "/css/dist/skins/skin-black.css?id=35602987835e5d50d162",
|
||||
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=6bd9c2420a41eaf96f0b",
|
||||
"/css/dist/skins/skin-red-dark.css": "/css/dist/skins/skin-red-dark.css?id=60de5bc2660c35544c4d",
|
||||
"/css/dist/skins/skin-black-dark.css": "/css/dist/skins/skin-black-dark.css?id=5789dd8af07b08034581",
|
||||
"/css/dist/skins/skin-red-dark.css": "/css/dist/skins/skin-red-dark.css?id=2e9f90ff200d4e9f45a8",
|
||||
"/css/dist/skins/skin-purple.css": "/css/dist/skins/skin-purple.css?id=b6dcb6d5c666fc5c8cc0",
|
||||
"/css/dist/skins/skin-purple-dark.css": "/css/dist/skins/skin-purple-dark.css?id=9dd1dc817a71431e5904",
|
||||
"/css/dist/skins/skin-purple-dark.css": "/css/dist/skins/skin-purple-dark.css?id=8150adf2e5f70ec3eb00",
|
||||
"/css/dist/skins/skin-yellow.css": "/css/dist/skins/skin-yellow.css?id=cb85a4e40e784319e878",
|
||||
"/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=4a19f5ae861f98f40bab",
|
||||
"/css/dist/skins/skin-yellow-dark.css": "/css/dist/skins/skin-yellow-dark.css?id=5fc4a3cf9407c6a9d398",
|
||||
"/css/dist/skins/skin-blue-dark.css": "/css/dist/skins/skin-blue-dark.css?id=2f665cf40d7348b3f94c",
|
||||
"/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=71c178700d68294e3413",
|
||||
"/css/dist/skins/skin-orange-dark.css": "/css/dist/skins/skin-orange-dark.css?id=5267e92a8df9ba833e01",
|
||||
"/css/dist/skins/skin-orange.css": "/css/dist/skins/skin-orange.css?id=b4fc4a74e1f6367dc3e2",
|
||||
"/css/dist/all.css": "/css/dist/all.css?id=6e3b75006f2b19d69f37",
|
||||
"/css/dist/all.css": "/css/dist/all.css?id=199fdf677ce0dce6cef8",
|
||||
"/css/blue.png": "/css/blue.png?id=4c85d6a97173123bd14a",
|
||||
"/css/blue@2x.png": "/css/blue@2x.png?id=62c67c6a822439e8a4ac",
|
||||
"/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=8dfcf59850a3f5775b8c",
|
||||
"/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=6bd9c2420a41eaf96f0b",
|
||||
"/css/dist/skins/skin-green-dark.min.css": "/css/dist/skins/skin-green-dark.min.css?id=eb4404a7b646ea42e025",
|
||||
"/css/dist/skins/skin-black-dark.min.css": "/css/dist/skins/skin-black-dark.min.css?id=5789dd8af07b08034581",
|
||||
"/css/dist/skins/skin-blue-dark.min.css": "/css/dist/skins/skin-blue-dark.min.css?id=2f665cf40d7348b3f94c",
|
||||
"/css/dist/skins/skin-yellow-dark.min.css": "/css/dist/skins/skin-yellow-dark.min.css?id=4a19f5ae861f98f40bab",
|
||||
"/css/dist/skins/skin-red-dark.min.css": "/css/dist/skins/skin-red-dark.min.css?id=60de5bc2660c35544c4d",
|
||||
"/css/dist/skins/skin-purple-dark.min.css": "/css/dist/skins/skin-purple-dark.min.css?id=9dd1dc817a71431e5904",
|
||||
"/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=71c178700d68294e3413",
|
||||
"/css/dist/skins/skin-yellow-dark.min.css": "/css/dist/skins/skin-yellow-dark.min.css?id=5fc4a3cf9407c6a9d398",
|
||||
"/css/dist/skins/skin-red-dark.min.css": "/css/dist/skins/skin-red-dark.min.css?id=2e9f90ff200d4e9f45a8",
|
||||
"/css/dist/skins/skin-purple-dark.min.css": "/css/dist/skins/skin-purple-dark.min.css?id=8150adf2e5f70ec3eb00",
|
||||
"/css/dist/skins/skin-orange-dark.min.css": "/css/dist/skins/skin-orange-dark.min.css?id=5267e92a8df9ba833e01",
|
||||
"/css/dist/skins/skin-contrast.min.css": "/css/dist/skins/skin-contrast.min.css?id=d7996d850e8bcdc4e167",
|
||||
"/css/dist/signature-pad.css": "/css/dist/signature-pad.css?id=6a89d3cd901305e66ced",
|
||||
"/css/build/signature-pad.min.css": "/css/build/signature-pad.min.css?id=d41d8cd98f00b204e980",
|
||||
"/css/dist/bootstrap-table.css": "/css/dist/bootstrap-table.css?id=1e77fde04b3f42432581",
|
||||
"/js/build/vendor.js": "/js/build/vendor.js?id=aff75d5aad5e7b429723",
|
||||
"/js/build/vendor.js": "/js/build/vendor.js?id=b93877b4a88a76e1b18b",
|
||||
"/js/dist/bootstrap-table.js": "/js/dist/bootstrap-table.js?id=58d95c93430f2ae33392",
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=0a2c2c95ab18fa16faa1"
|
||||
"/js/dist/all.js": "/js/dist/all.js?id=b4627a6533d841cd8fdf"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
|
||||
<div v-show="processDetail" class="col-md-6 col-md-offset-3">
|
||||
<div v-show="processDetail" class="col-md-12">
|
||||
|
||||
<div class="row">
|
||||
<div class="dynamic-form-row">
|
||||
@@ -50,8 +50,7 @@
|
||||
</div> <!-- /div row -->
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2"></div>
|
||||
<div class="col-md-8" style="padding-top: 30px;">
|
||||
<div class="col-md-12" style="padding-top: 30px;">
|
||||
<div class="col-md-4 text-right"><h4>Header Field</h4></div>
|
||||
<div class="col-md-4"><h4>Import Field</h4></div>
|
||||
<div class="col-md-4"><h4>Sample Value</h4></div>
|
||||
@@ -60,8 +59,7 @@
|
||||
|
||||
<template v-for="(header, index) in file.header_row">
|
||||
<div class="row">
|
||||
<div class="col-md-2"></div>
|
||||
<div class="col-md-8">
|
||||
<div class="col-md-12">
|
||||
<div class="col-md-4 text-right">
|
||||
<label :for="header" class="control-label">{{ header }}</label>
|
||||
</div>
|
||||
|
||||
@@ -31,8 +31,10 @@
|
||||
<table class="table table-borderless m-b-none" v-if="tokens.length > 0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="col-md-9">Name</th>
|
||||
<th class="col-md-3"><span class="sr-only">Delete</span></th>
|
||||
<th class="col-md-3">Name</th>
|
||||
<th class="col-md-2">Created</th>
|
||||
<th class="col-md-2">Expires</th>
|
||||
<th class="col-md-2"><span class="sr-only">Delete</span></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@@ -43,6 +45,14 @@
|
||||
{{ token.name }}
|
||||
</td>
|
||||
|
||||
<td style="vertical-align: middle;">
|
||||
{{ token.created_at }}
|
||||
</td>
|
||||
|
||||
<td style="vertical-align: middle;">
|
||||
{{ token.expires_at }}
|
||||
</td>
|
||||
|
||||
<!-- Delete Button -->
|
||||
<td style="vertical-align: middle;" class="text-right">
|
||||
<a class="action-link btn btn-danger btn-sm" @click="revoke(token)">
|
||||
|
||||
@@ -131,6 +131,12 @@ a {
|
||||
background-color: var(--back-main);
|
||||
color: var(--text-main);
|
||||
}
|
||||
.popover {
|
||||
background-color:var(--back-main);
|
||||
}
|
||||
.popover-title {
|
||||
background-color: #111;
|
||||
}
|
||||
|
||||
a, a:link, a:visited, .btn-primary.hover {
|
||||
color: var(--header);
|
||||
|
||||
@@ -131,6 +131,12 @@ a {
|
||||
background-color: var(--back-main);
|
||||
color: var(--text-main);
|
||||
}
|
||||
.popover {
|
||||
background-color:var(--back-main);
|
||||
}
|
||||
.popover-title {
|
||||
background-color: #00a65a;
|
||||
}
|
||||
|
||||
a, a:link, a:visited, .btn-primary.hover {
|
||||
color: var(--header);
|
||||
|
||||
@@ -131,6 +131,12 @@ a {
|
||||
background-color: var(--back-main);
|
||||
color: var(--text-main);
|
||||
}
|
||||
.popover {
|
||||
background-color:var(--back-main);
|
||||
}
|
||||
.popover-title {
|
||||
background-color: #ff8c00;
|
||||
}
|
||||
|
||||
a, a:link, a:visited, .btn-primary.hover {
|
||||
color: var(--header);
|
||||
|
||||
@@ -131,6 +131,12 @@ a {
|
||||
background-color: var(--back-main);
|
||||
color: var(--text-main);
|
||||
}
|
||||
.popover {
|
||||
background-color:var(--back-main);
|
||||
}
|
||||
.popover-title {
|
||||
background-color: #605ca8;
|
||||
}
|
||||
|
||||
a, a:link, a:visited, .btn-primary.hover {
|
||||
color: var(--header);
|
||||
|
||||
@@ -258,6 +258,12 @@ input[type=text], input[type=search] {
|
||||
background-color: var(--back-main);
|
||||
color: var(--header);
|
||||
}
|
||||
.popover {
|
||||
background-color:var(--back-main);
|
||||
}
|
||||
.popover-title {
|
||||
background-color: #dd4b39;
|
||||
}
|
||||
.select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[aria-selected=true]:hover {
|
||||
background-color: var(--back-sub);
|
||||
color: var(--header);
|
||||
|
||||
@@ -258,6 +258,12 @@ input[type=text], input[type=search] {
|
||||
background-color: var(--back-main);
|
||||
color: var(--header);
|
||||
}
|
||||
.popover {
|
||||
background-color:var(--back-main);
|
||||
}
|
||||
.popover-title {
|
||||
background-color: #f39c12;
|
||||
}
|
||||
.select2-container--default .select2-results__option[aria-selected=true], .select2-container--default .select2-results__option[aria-selected=true]:hover {
|
||||
background-color: var(--back-sub);
|
||||
color: var(--header);
|
||||
|
||||
@@ -83,6 +83,7 @@ return array(
|
||||
'ldap_auth_filter_query' => 'LDAP-verifikasie navraag',
|
||||
'ldap_version' => 'LDAP-weergawe',
|
||||
'ldap_active_flag' => 'LDAP-aktiewe vlag',
|
||||
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
|
||||
'ldap_emp_num' => 'LDAP Werknemersnommer',
|
||||
'ldap_email' => 'LDAP-e-pos',
|
||||
'license' => 'Software License',
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
'depreciation_report' => 'Waardeverminderingsverslag',
|
||||
'details' => 'Details',
|
||||
'download' => 'Aflaai',
|
||||
'download_all' => 'Download All',
|
||||
'depreciation' => 'waardevermindering',
|
||||
'editprofile' => 'Wysig jou profiel',
|
||||
'eol' => 'EOL',
|
||||
@@ -95,12 +96,6 @@
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'firstnamelastname' => 'First Name Last Name (janesmith@example.com)',
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'first_name' => 'Eerste naam',
|
||||
'first_name_format' => 'Voornaam (jane@example.com)',
|
||||
'files' => 'Files',
|
||||
@@ -119,6 +114,8 @@
|
||||
'image_upload' => 'Laai prent op',
|
||||
'image_filetypes_help' => 'Accepted filetypes are jpg, png, gif, and svg. Max upload size allowed is :size.',
|
||||
'import' => 'invoer',
|
||||
'importing' => 'Importing',
|
||||
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
|
||||
'import-history' => 'Invoer Geskiedenis',
|
||||
'asset_maintenance' => 'Bate Onderhoud',
|
||||
'asset_maintenance_report' => 'Asset Maintenance Report',
|
||||
@@ -242,4 +239,9 @@
|
||||
'login_enabled' => 'Login Enabled',
|
||||
'audit_due' => 'Due for Audit',
|
||||
'audit_overdue' => 'Overdue for Audit',
|
||||
'accept' => 'Accept :asset',
|
||||
'i_accept' => 'I accept',
|
||||
'i_decline' => 'I decline',
|
||||
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
|
||||
'clear_signature' => 'Clear Signature'
|
||||
];
|
||||
|
||||
@@ -69,5 +69,11 @@ return array(
|
||||
'welcome' => 'Welkom: naam',
|
||||
'welcome_to' => 'Welkom by: web!',
|
||||
'your_credentials' => 'Jou Snipe-IT-referenties',
|
||||
|
||||
'Accessory_Checkin_Notification' => 'Accessory checked in',
|
||||
'Asset_Checkin_Notification' => 'Asset checked in',
|
||||
'License_Checkin_Notification' => 'License checked in',
|
||||
'Expected_Checkin_Report' => 'Expected asset checkin report',
|
||||
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
|
||||
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
|
||||
'your_assets' => 'View Your Assets'
|
||||
);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
return array(
|
||||
|
||||
'does_not_exist' => 'The accessory [:id] does not exist.',
|
||||
'does_not_exist' => 'الملحق [:id] غير موجود.',
|
||||
'assoc_users' => 'تم إخراج :count عنصر من هذا الملحق للمستخدمين، الرجاء ادخال بعض الملحقات ثم حاول مرة أخرى. ',
|
||||
|
||||
'create' => array(
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
'repair' => 'إصلاح',
|
||||
'maintenance' => 'صيانة',
|
||||
'upgrade' => 'الترقية',
|
||||
'calibration' => 'Calibration',
|
||||
'software_support' => 'Software Support',
|
||||
'hardware_support' => 'Hardware Support',
|
||||
'calibration' => 'المعايره',
|
||||
'software_support' => 'دعم البرامج',
|
||||
'hardware_support' => 'دعم الأجهزة',
|
||||
];
|
||||
|
||||
@@ -20,6 +20,6 @@ return array(
|
||||
'title' => 'أصل ',
|
||||
'image' => 'صورة الجهاز',
|
||||
'days_without_acceptance' => 'أيام بدون قبول',
|
||||
'monthly_depreciation' => 'Monthly Depreciation'
|
||||
'monthly_depreciation' => 'الإهلاك الشهري'
|
||||
|
||||
);
|
||||
|
||||
@@ -1,17 +1,19 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'about_kits_title' => 'About Predefined Kits',
|
||||
'about_kits_text' => 'Predefined Kits let you quickly check out a collection of items (assets, licenses, etc) to a user. This can be helpful when your onboarding process is consistent across many users and all users receive the same items.',
|
||||
'checkout' => 'Checkout Kit ',
|
||||
'create_success' => 'Kit was successfully created.',
|
||||
'create' => 'Create Predefined Kit',
|
||||
'update' => 'Update Predefined Kit',
|
||||
'delete_success' => 'Kit was successfully deleted.',
|
||||
'update_success' => 'Kit was successfully updated.',
|
||||
'none_models' => 'There are not enough available assets for :model to checkout. :qty are required. ',
|
||||
'none_licenses' => 'There are not enough available seats for :license to checkout. :qty are required. ',
|
||||
'none_consumables' => 'There are not enough available units of :consumable to checkout. :qty are required. ',
|
||||
'none_accessory' => 'There are not enough available units of :accessory to checkout. :qty are required. ',
|
||||
'about_kits_title' => 'حول مجموعات محددة مسبقا',
|
||||
'about_kits_text' => 'مجموعات محددة مسبقا تتيح لك تحقق بسرعة من مجموعة من العناصر (الأصول والتراخيص ، الخ) لمستخدم. قد يكون هذا مفيداً عندما تكون عملية تشغيلك متناسقة عبر العديد من المستخدمين وتتلقى كافة المستخدمين نفس العناصر.
|
||||
',
|
||||
'checkout' => 'مجموعة الخروج ',
|
||||
'create_success' => 'تم إنشاء مجموعة الأدوات بنجاح.',
|
||||
'create' => 'إنشاء مجموعة أدوات معرفة مسبقاً',
|
||||
'update' => 'تحديث مجموعة أدوات معرّفة مسبقاً',
|
||||
'delete_success' => 'تم حذف عدة بنجاح.',
|
||||
'update_success' => 'تم تحديث مجموعة الأدوات بنجاح.',
|
||||
'none_models' => 'لا توجد أصول متوفرة كافية لـ:نموذج لـ Checkout. الكمية مطلوبة.
|
||||
',
|
||||
'none_licenses' => 'لا توجد مقاعد كافية متاحة لـ: ترخيص الخروج. الكمية مطلوبة. ',
|
||||
'none_consumables' => 'لا توجد وحدات متوفرة كافية من: قابلة للاستهلاك لـ Checkout. الكمية مطلوبة. ',
|
||||
'none_accessory' => 'لا توجد وحدات متوفرة كافية من: ملحق ل checkout. الكمية مطلوبة. ',
|
||||
|
||||
);
|
||||
|
||||
@@ -8,7 +8,7 @@ return array(
|
||||
'owner_doesnt_match_asset' => 'الأصل اللذي تحاول ربطه مع هذا الترخيص حاليا مملوك لشخص اخر غير اللذي تم اختياره من القائمة المنسدلة.',
|
||||
'assoc_users' => 'هذا الترخيص حاليا مخرج لمستخدم ولا يمكن حذفه. يرجى التحقق من الترخيص في البداية، ثم محاولة الحذف مرة أخرى. ',
|
||||
'select_asset_or_person' => 'يجب تحديد أصل أو مستخدم، وليس كليهما.',
|
||||
'not_found' => 'License not found',
|
||||
'not_found' => 'لم يتم العثور على الترخيص',
|
||||
|
||||
|
||||
'create' => array(
|
||||
|
||||
@@ -4,9 +4,9 @@ return array(
|
||||
'ad' => 'الدليل النشط',
|
||||
'ad_domain' => 'مجال الدليل النشط',
|
||||
'ad_domain_help' => 'هذا هو أحيانا نفس نطاق البريد الإلكتروني الخاص بك، ولكن ليس دائما.',
|
||||
'ad_append_domain_label' => 'Append domain name',
|
||||
'ad_append_domain' => 'Append domain name to username field',
|
||||
'ad_append_domain_help' => 'User isn\'t required to write "username@domain.local", they can just type "username".' ,
|
||||
'ad_append_domain_label' => 'إلحاق اسم domain',
|
||||
'ad_append_domain' => 'إلحاق اسم domain إلى حقل اسم المستخدم',
|
||||
'ad_append_domain_help' => 'المستخدم غير مطلوب لكتابة "username@domain.local" ، فإنها يمكن أن تكتب فقط "اسم المستخدم".' ,
|
||||
'admin_cc_email' => 'نسخة اضافية للبريد الإكتروني',
|
||||
'admin_cc_email_help' => 'إذا كنت ترغب في إرسال نسخة من رسائل البريد الإلكتروني لتسجيل الدخول / الخروج التي يتم إرسالها إلى المستخدمين إلى حساب بريد إلكتروني إضافي، فقم بإدخالها هنا. خلاف ذلك، اترك هذه الخانة فارغة.',
|
||||
'is_ad' => 'هذا هو ملقم أكتيف ديركتوري',
|
||||
@@ -25,7 +25,7 @@ return array(
|
||||
'backups' => 'النسخ الإحتياطية',
|
||||
'barcode_settings' => 'إعدادات الباركود',
|
||||
'confirm_purge' => 'تأكيد التطهير',
|
||||
'confirm_purge_help' => 'Enter the text "DELETE" in the box below to purge your deleted records. This action cannot be undone and will PERMANENTLY delete all soft-deleted items and users. (You should make a backup first, just to be safe.)',
|
||||
'confirm_purge_help' => 'أدخل النص "DELETE" في المربع أدناه لإزالة السجلات المحذوفة. لا يمكن التراجع عن هذا الإجراء وسيتم حذف كافة العناصر حذف ناعمة والمستخدمين بشكل دائم. (يجب أن تقوم بعمل نسخة احتياطية أولاً، فقط لتكون آمنة.)',
|
||||
'custom_css' => 'CSS مخصص',
|
||||
'custom_css_help' => 'أدخل أي تخصيصات CSS ترغب في استخدامها. لا تقم باضافة <style></style>.',
|
||||
'custom_forgot_pass_url' => 'رابط مخصص لاعادة تعيين كلمة المرور',
|
||||
@@ -41,23 +41,23 @@ return array(
|
||||
'display_eol' => 'عرض نهاية العمر على شكل جدول',
|
||||
'display_qr' => 'عرض رموز مربع',
|
||||
'display_alt_barcode' => 'عرض 1D الباركود',
|
||||
'email_logo' => 'Email Logo',
|
||||
'email_logo' => 'شعار البريد الإلكتروني',
|
||||
'barcode_type' => '2D نوع الباركود',
|
||||
'alt_barcode_type' => '1D نوع الباركود',
|
||||
'email_logo_size' => 'Square logos in email look best. ',
|
||||
'email_logo_size' => 'الشعارات الشعارات البريد الإلكتروني في البريد الإلكتروني تبدو أفضل. ',
|
||||
'eula_settings' => 'إعدادات اتفاقية ترخيص المستخدم النهائي',
|
||||
'eula_markdown' => 'تسمح اتفاقية ترخيص المستخدم هذه <a href="https://help.github.com/articles/github-flavored-markdown/">بتطبيق نمط الكتابة من Github</a>.',
|
||||
'favicon' => 'Favicon',
|
||||
'favicon_format' => 'Accepted filetypes are ico, png, and gif. Other image formats may not work in all browsers.',
|
||||
'favicon_size' => 'Favicons should be square images, 16x16 pixels.',
|
||||
'favicon_format' => 'أنواع الملفات المقبولة هي رمز و png و gif. قد لا تعمل تنسيقات الصور الأخرى في كافة المستعرضات.',
|
||||
'favicon_size' => 'وينبغي أن تكون Favicons صور مربعة ، 16x16 بكسل.',
|
||||
'footer_text' => 'إضافة نص لتذييل الصفحة ',
|
||||
'footer_text_help' => 'This text will appear in the right-side footer. Links are allowed using <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>. Line breaks, headers, images, etc may result in unpredictable results.',
|
||||
'footer_text_help' => 'سيظهر هذا النص في تذييل الجانب الأيمن. يُسمح باستخدام الروابط باستخدام < href="https://help.github.com/articles/github-flavored-markdown/">eGithub بنكهة markdown</a>. فواصل الأسطر، رؤوس، الصور، الخ قد يؤدي إلى نتائج غير متوقعة.',
|
||||
'general_settings' => 'الاعدادات العامة',
|
||||
'generate_backup' => 'إنشاء النسخ الاحتياطي',
|
||||
'header_color' => 'رأس اللون',
|
||||
'info' => 'تتيح لك هذه الإعدادات تخصيص بعض جوانب التثبيت.',
|
||||
'label_logo' => 'Label Logo',
|
||||
'label_logo_size' => 'Square logos look best - will be displayed in the top right of each asset label. ',
|
||||
'label_logo' => 'شعار التسمية',
|
||||
'label_logo_size' => 'الشعارات المربعة تبدو أفضل - سيتم عرضها في أعلى يمين كل ملصق أصل. ',
|
||||
'laravel' => 'نسخة لارافيل',
|
||||
'ldap_enabled' => 'تم تمكين لداب',
|
||||
'ldap_integration' => 'دمج لداب',
|
||||
@@ -83,6 +83,7 @@ return array(
|
||||
'ldap_auth_filter_query' => 'استعلام مصادقة لداب',
|
||||
'ldap_version' => 'إصدار لداب',
|
||||
'ldap_active_flag' => 'لداب العلم النشط',
|
||||
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
|
||||
'ldap_emp_num' => 'رقم موظف لداب',
|
||||
'ldap_email' => 'بريد لداب',
|
||||
'license' => 'ترخيص البرنامج',
|
||||
@@ -92,13 +93,13 @@ return array(
|
||||
'login_note_help' => 'اختيارياً تضمين بعض الجمل على شاشة تسجيل الدخول الخاصة بك، على سبيل المثال لمساعدة الناس الذين وجدوا أحد الأجهزة المفقودة أو المسروقة. يقبل هذا الحقل <a href="https://help.github.com/articles/github-flavored-markdown/">بتطبيق نمط الكتابة من Github</a>',
|
||||
'login_remote_user_text' => 'خيارات تسجيل دخول المستخدم عن بعد',
|
||||
'login_remote_user_enabled_text' => 'تمكين تسجيل الدخول باستخدام الخانة الرئيسية للمستخدم عن بعد',
|
||||
'login_remote_user_enabled_help' => 'This option enables Authentication via the REMOTE_USER header according to the "Common Gateway Interface (rfc3875)"',
|
||||
'login_remote_user_enabled_help' => 'هذا الخيار تمكين المصادقة عبر رأس REMOTE_USER وفقاً ل "واجهة عبّارة الشائعة (rfc3875)"',
|
||||
'login_common_disabled_text' => 'تعطيل آليات المصادقة الأخرى',
|
||||
'login_common_disabled_help' => 'يعمل هذا الخيار على تعطيل آليات المصادقة الأخرى. ما عليك سوى تمكين هذا الخيار إذا كنت متأكدًا من أن تسجيل الدخول إلى المستخدم_عن_بعد يعمل بالفعل',
|
||||
'login_remote_user_custom_logout_url_text' => 'عنوان صفحة مخصص لتسجيل الخروج',
|
||||
'login_remote_user_custom_logout_url_help' => 'If a url is provided here, users will get redirected to this URL after the user logs out of Snipe-IT. This is useful to close the user sessions of your Authentication provider correctly.',
|
||||
'login_remote_user_header_name_text' => 'Custom user name header',
|
||||
'login_remote_user_header_name_help' => 'Use the specified header instead of REMOTE_USER',
|
||||
'login_remote_user_custom_logout_url_help' => 'إذا تم توفير عنوان URL هنا، سيتم إعادة توجيه المستخدمين إلى عنوان URL هذا بعد تسجيل خروج المستخدم من Snipe-IT. هذا مفيد لإغلاق جلسات عمل المستخدم لموفر المصادقة بشكل صحيح.',
|
||||
'login_remote_user_header_name_text' => 'الاسم المستعار للمستخدم',
|
||||
'login_remote_user_header_name_help' => 'استخدم اسم المستعار المحدد بدلاً من REMOTE_USER',
|
||||
'logo' => 'شعار',
|
||||
'logo_print_assets' => 'الاستخدام في الطباعة',
|
||||
'logo_print_assets_help' => 'استخدم العلامة التجارية في قوائم الأصول القابلة للطباعة ',
|
||||
@@ -113,56 +114,56 @@ return array(
|
||||
'pwd_secure_complexity' => 'تعقيد كلمة المرور',
|
||||
'pwd_secure_complexity_help' => 'حدد أي قواعد تعقيد كلمة المرور التي ترغب في فرضها.',
|
||||
'pwd_secure_min' => 'كلمة المرور الحد الأدنى من الأحرف',
|
||||
'pwd_secure_min_help' => 'Minimum permitted value is 8',
|
||||
'pwd_secure_min_help' => 'الحد الأدنى المسموح به هو 8',
|
||||
'pwd_secure_uncommon' => 'منع كلمات المرور الشائعة',
|
||||
'pwd_secure_uncommon_help' => 'سيؤدي ذلك إلى منع المستخدمين من استخدام كلمات المرور الشائعة من أعلى 10000 كلمة مرور يتم الإبلاغ عنها في حالات خرق.',
|
||||
'qr_help' => 'تمكين رموز قر أولا لتعيين هذا',
|
||||
'qr_text' => 'نص رمز الاستجابة السريعة',
|
||||
'saml_enabled' => 'SAML enabled',
|
||||
'saml_integration' => 'SAML Integration',
|
||||
'saml_sp_entityid' => 'Entity ID',
|
||||
'saml_sp_acs_url' => 'Assertion Consumer Service (ACS) URL',
|
||||
'saml_sp_sls_url' => 'Single Logout Service (SLS) URL',
|
||||
'saml_sp_x509cert' => 'Public Certificate',
|
||||
'saml_idp_metadata' => 'SAML IdP Metadata',
|
||||
'saml_idp_metadata_help' => 'You can specify the IdP metadata using a URL or XML file.',
|
||||
'saml_attr_mapping_username' => 'Attribute Mapping - Username',
|
||||
'saml_attr_mapping_username_help' => 'NameID will be used if attribute mapping is unspecified or invalid.',
|
||||
'saml_forcelogin_label' => 'SAML Force Login',
|
||||
'saml_forcelogin' => 'Make SAML the primary login',
|
||||
'saml_forcelogin_help' => 'You can use \'/login?nosaml\' to get to the normal login page.',
|
||||
'saml_slo_label' => 'SAML Single Log Out',
|
||||
'saml_slo' => 'Send a LogoutRequest to IdP on Logout',
|
||||
'saml_slo_help' => 'This will cause the user to be first redirected to the IdP on logout. Leave unchecked if the IdP doesn\'t correctly support SP-initiated SAML SLO.',
|
||||
'saml_custom_settings' => 'SAML Custom Settings',
|
||||
'saml_custom_settings_help' => 'You can specify additional settings to the onelogin/php-saml library. Use at your own risk.',
|
||||
'saml_enabled' => 'تمكين SAML',
|
||||
'saml_integration' => 'الدمج مع نظام ادارة طلبات الزبائن',
|
||||
'saml_sp_entityid' => 'معرف الكيان',
|
||||
'saml_sp_acs_url' => 'رابط خدمة مستهلك الضمان (ACS)',
|
||||
'saml_sp_sls_url' => 'رابط خدمة تسجيل الخروج الفردي (SLS)',
|
||||
'saml_sp_x509cert' => 'شهادة عامة',
|
||||
'saml_idp_metadata' => 'بيانات تعريف هوية SAML',
|
||||
'saml_idp_metadata_help' => 'يمكنك تحديد بيانات التعريف الشخصية الشخصية باستخدام عنوان URL أو ملف XML.',
|
||||
'saml_attr_mapping_username' => 'تعيين السمة - اسم المستخدم',
|
||||
'saml_attr_mapping_username_help' => 'سيتم استخدام اسم المعرف إذا كانت خرائط السمة غير محددة أو غير صالحة.',
|
||||
'saml_forcelogin_label' => 'تسجيل دخول قوة SAML',
|
||||
'saml_forcelogin' => 'جعل SAML تسجيل الدخول الأساسي',
|
||||
'saml_forcelogin_help' => 'يمكنك استخدام \'/login?nosaml\' للوصول إلى صفحة تسجيل الدخول العادية.',
|
||||
'saml_slo_label' => 'تسجيل الخروج الفردي لSAML',
|
||||
'saml_slo' => 'إرسال طلب تسجيل الدخول إلى الهوية عند تسجيل الخروج',
|
||||
'saml_slo_help' => 'سيؤدي هذا إلى إعادة توجيه المستخدم لأول مرة إلى تسجيل الخروج من الهوية الشخصية. اتركه دون تحديد إذا كانت الهوية الشخصية لا تدعم بشكل صحيح SP-SAML SLO.',
|
||||
'saml_custom_settings' => 'إعدادات SAML المخصصة',
|
||||
'saml_custom_settings_help' => 'يمكنك تحديد إعدادات إضافية لمكتبة onelogin/php-saml. استخدمها على مسؤوليتك الخاصة.',
|
||||
'setting' => 'ضبط',
|
||||
'settings' => 'إعدادات',
|
||||
'show_alerts_in_menu' => 'عرض التنبيهات في القائمة العلوية',
|
||||
'show_archived_in_list' => 'الأصول المحفوظة',
|
||||
'show_archived_in_list_text' => 'عرض الأصول المحفوظة في قائمة "جميع الأصول"',
|
||||
'show_assigned_assets' => 'Show assets assigned to assets',
|
||||
'show_assigned_assets_help' => 'Display assets which were assigned to the other assets in View User -> Assets, View User -> Info -> Print All Assigned and in Account -> View Assigned Assets.',
|
||||
'show_assigned_assets' => 'إظهار الأصول المسندة إلى الأصول',
|
||||
'show_assigned_assets_help' => 'عرض الأصول التي تم تعيينها إلى الأصول الأخرى في عرض المستخدم -> الأصول، عرض المستخدم -> معلومات -> طباعة جميع المعينات و في الحساب -> عرض الأصول المعينة.',
|
||||
'show_images_in_email' => 'إظهار الصور في رسائل البريد الإلكتروني',
|
||||
'show_images_in_email_help' => 'Uncheck this box if your Snipe-IT installation is behind a VPN or closed network and users outside the network will not be able to load images served from this installation in their emails.',
|
||||
'show_images_in_email_help' => 'قم بإلغاء تحديد هذا المربع إذا كان تثبيت Snipe-IT وراء شبكة VPN أو شبكة مغلقة ولن يتمكن المستخدمون خارج الشبكة من تحميل الصور التي يخدمها هذا التثبيت في رسائل البريد الإلكتروني الخاصة بهم.',
|
||||
'site_name' => 'اسم الموقع',
|
||||
'slack_botname' => 'سلاك بوتنام',
|
||||
'slack_channel' => 'قناة سلاك',
|
||||
'slack_endpoint' => 'نقطة نهاية سلاك',
|
||||
'slack_integration' => 'إعدادات سلاك',
|
||||
'slack_integration_help' => 'Slack integration is optional, however the endpoint and channel are required if you wish to use it. To configure Slack integration, you must first <a href=":slack_link" target="_new" rel="noopener">create an incoming webhook</a> on your Slack account. Click on the <strong>Test Slack Integration</strong> button to confirm your settings are correct before saving. ',
|
||||
'slack_integration_help' => 'التكامل الأسود اختياري، ولكن نقطة النهاية والقناة مطلوبة إذا كنت ترغب في استخدامها. لتكوين تكامل Slack ، يجب أولاً <a href=":slack_link" target="_new" rel="noopener">إنشاء ويب هوك وارد</a> على حساب Slack الخاص بك. انقر على زر <strong>اختبار التكامل السوداء</strong> لتأكيد أن إعداداتك صحيحة قبل الحفظ. ',
|
||||
'slack_integration_help_button' => 'عند الانتهاء من حفظ معلومات Slack الخاصة بك، سوف يظهر زر الفحص.',
|
||||
'slack_test_help' => 'Test whether your Slack integration is configured correctly. YOU MUST SAVE YOUR UPDATED SLACK SETTINGS FIRST.',
|
||||
'slack_test_help' => 'اختبر ما إذا كان تكامل Slack الخاص بك قد تم تكوينه بشكل صحيح. لقد قمت بحفظ إعدادات SLACK الخاصة بك.',
|
||||
'snipe_version' => 'قنص-إيت الإصدار',
|
||||
'support_footer' => 'Support Footer Links ',
|
||||
'support_footer_help' => 'Specify who sees the links to the Snipe-IT Support info and Users Manual',
|
||||
'support_footer' => 'دعم روابط تذييل الصفحة ',
|
||||
'support_footer_help' => 'تحديد من يرى الروابط إلى دليل معلومات الدعم للمستخدمين عن طريق القناصة',
|
||||
'version_footer' => 'رقم الاصدار في التذييل ',
|
||||
'version_footer_help' => 'حدد من سوف يرى إصدار Snipe-IT و رقم النسخة.',
|
||||
'system' => 'معلومات النظام',
|
||||
'update' => 'إعدادات التحديث',
|
||||
'value' => 'القيمة',
|
||||
'brand' => 'العلامات التجارية',
|
||||
'web_brand' => 'Web Branding Type',
|
||||
'web_brand' => 'نوع العلامات التجارية للويب',
|
||||
'about_settings_title' => 'حول الإعدادات',
|
||||
'about_settings_text' => 'تتيح لك هذه الإعدادات تخصيص بعض جوانب التثبيت.',
|
||||
'labels_per_page' => 'عدد التسميات لكل صفحة',
|
||||
@@ -171,7 +172,7 @@ return array(
|
||||
'page_padding' => 'هوامش الصفحة (بوصة)',
|
||||
'privacy_policy_link' => 'رابط سياسة الخصوصية',
|
||||
'privacy_policy' => 'سياسة الخصوصية',
|
||||
'privacy_policy_link_help' => 'If a url is included here, a link to your privacy policy will be included in the app footer and in any emails that the system sends out, in compliance with GDPR. ',
|
||||
'privacy_policy_link_help' => 'إذا تم تضمين عنوان URL هنا، سيتم تضمين رابط لسياسة الخصوصية الخاصة بك في تذييل التطبيق وفي أي رسائل البريد الإلكتروني التي يرسلها النظام، وفقاً لهذا التقرير. ',
|
||||
'purge' => 'تطهير السجلات المحذوفة',
|
||||
'labels_display_bgutter' => 'الجزء السفلي للتسمية',
|
||||
'labels_display_sgutter' => 'الجزء الجانبي للتسمية',
|
||||
@@ -217,5 +218,5 @@ return array(
|
||||
'unique_serial' => 'أرقام تسلسلية مميزة',
|
||||
'unique_serial_help_text' => 'تحديد المربع سيؤدي الى فرض سياسة التفرد على الرقم التسلسلي للمتلكات',
|
||||
'zerofill_count' => 'طول ترميز الأصل، بما في ذلك تعبئة الاصفار',
|
||||
'username_format_help' => 'This setting will only be used by the import process if a username is not provided and we have to generate a username for you.',
|
||||
'username_format_help' => 'سيتم استخدام هذا الإعداد فقط من قبل عملية الاستيراد إذا لم يتم توفير اسم المستخدم ويتعين علينا إنشاء اسم مستخدم لك.',
|
||||
);
|
||||
|
||||
@@ -6,7 +6,7 @@ return array(
|
||||
'create' => 'إنشاء تسمية الحالة',
|
||||
'color' => 'لون الرسم البياني',
|
||||
'default_label' => 'الوسم الافتراضي',
|
||||
'default_label_help' => 'This is used to ensure your most commonly used status labels appear at the top of the select box when creating/editing assets.',
|
||||
'default_label_help' => 'يستخدم هذا للتأكد من أن تسميات الحالة الأكثر استخداما تظهر في الجزء العلوي من المربع المحدد عند إنشاء/تحرير الأصول.',
|
||||
'deployable' => 'قابل للتوزيع',
|
||||
'info' => 'يتم استخدام تسميات الحالة لوصف الحالات المحتملة للأصول التابعة لك. قد تكون قيد الصيانة أو ضمن المفقودة أو المسروقة، وما إلى ذلك. يمكنك إنشاء تسميات حالة جديدة للأصول القابلة للتوزيع وقيد الانتظار والمؤرشفة.',
|
||||
'name' => 'اسم الحالة',
|
||||
|
||||
@@ -19,7 +19,7 @@ return array(
|
||||
'ldap_config_text' => 'يمكن العثور على إعدادات تهيئة لداب المشرف> الإعدادات. سيتم تعيين الموقع (اختياري) المحدد لجميع المستخدمين الذين تم استيرادهم.',
|
||||
'print_assigned' => 'طباعة كل الممتلكات',
|
||||
'software_user' => 'البرامج المخرجة الى: :name',
|
||||
'send_email_help' => 'You must provide an email address for this user to send them credentials. Emailing credentials can only be done on user creation. Passwords are stored in a one-way hash and cannot be retrieved once saved.',
|
||||
'send_email_help' => 'يجب عليك توفير عنوان بريد إلكتروني لهذا المستخدم لإرسال بيانات اعتماده. لا يمكن إرسال بيانات الاعتماد البريدية إلا عند إنشاء المستخدم. يتم تخزين كلمات المرور في تجزئة ذات اتجاه واحد ولا يمكن استرجاعها بمجرد الحفظ.',
|
||||
'view_user' => 'عرض المستخدم :name',
|
||||
'usercsv' => 'ملف CSV',
|
||||
'two_factor_admin_optin_help' => 'تسمح إعدادات المشرف الحالية بإنفاذ انتقائي للمصادقة الثنائية.',
|
||||
|
||||
@@ -12,7 +12,7 @@ return array(
|
||||
'insufficient_permissions' => 'صلاحيات غير كافية.',
|
||||
'user_deleted_warning' => 'تم حذف المستخدم. سيكون عليك استعادة هذا المستخدم اذا ارت التعديل عليه او تسليمه اجهزة جديدة.',
|
||||
'ldap_not_configured' => 'لم يتم تكوين دمج لداب لهذا التثبيت.',
|
||||
'password_resets_sent' => 'The selected users who are activated and have a valid email addresses have been sent a password reset link.',
|
||||
'password_resets_sent' => 'تم إرسال رابط إعادة تعيين كلمة المرور للمستخدمين المحددين الذين تم تفعيلهم ولديهم عناوين بريد إلكتروني صالحة.',
|
||||
|
||||
|
||||
'success' => array(
|
||||
|
||||
@@ -4,7 +4,7 @@ return [
|
||||
'send_password_link' => 'إرسال رسالة إعادة تعيين كلمة المرور',
|
||||
'email_reset_password' => 'البريد الإلكتروني إعادة تعيين كلمة المرور',
|
||||
'reset_password' => 'إعادة تعيين كلمة المرور',
|
||||
'saml_login' => 'Login via SAML',
|
||||
'saml_login' => 'تسجيل الدخول عبر SAML',
|
||||
'login' => 'الدخول',
|
||||
'login_prompt' => 'الرجاء تسجيل الدخول',
|
||||
'forgot_password' => 'نسيت كلمة المرور',
|
||||
|
||||
@@ -7,13 +7,13 @@ return array(
|
||||
'account_not_activated' => 'لم يتم تنشيط حساب هذا المستخدم.',
|
||||
'account_suspended' => 'تم تعليق حساب المستخدم هذا.',
|
||||
'account_banned' => 'تم حظر حساب المستخدم هذا.',
|
||||
'throttle' => 'Too many failed login attempts. Please try again in :minutes minutes.',
|
||||
'throttle' => 'هناك عدد كبير جدا من محاولات تسجيل الدخول الفاشلة. يرجى المحاولة مرة أخرى خلال :minutes دقيقة.',
|
||||
|
||||
'two_factor' => array(
|
||||
'already_enrolled' => 'Your device is already enrolled.',
|
||||
'success' => 'You have successfully logged in.',
|
||||
'code_required' => 'Two-factor code is required.',
|
||||
'invalid_code' => 'Two-factor code is invalid.',
|
||||
'already_enrolled' => 'جهازك مسجل مسبقا.',
|
||||
'success' => 'قمت بتسجيل الدخول بنجاح.',
|
||||
'code_required' => 'رمز Two-factor مطلوب.',
|
||||
'invalid_code' => 'رمز Two-factor غير صالح.',
|
||||
),
|
||||
|
||||
'signin' => array(
|
||||
@@ -22,8 +22,8 @@ return array(
|
||||
),
|
||||
|
||||
'logout' => array(
|
||||
'error' => 'There was a problem while trying to log you out, please try again.',
|
||||
'success' => 'You have successfully logged out.',
|
||||
'error' => 'حدثت مشكلة أثناء محاولة تسجيل دخولك، الرجاء إعادة المحاولة.',
|
||||
'success' => 'قمت بتسجيل الدخول بنجاح.',
|
||||
),
|
||||
|
||||
'signup' => array(
|
||||
@@ -33,7 +33,7 @@ return array(
|
||||
|
||||
'forgot-password' => array(
|
||||
'error' => 'حدثت مشكلة أثناء محاولة الحصول على رمز إعادة تعيين كلمة المرور، الرجاء إعادة المحاولة.',
|
||||
'success' => 'If that email address exists in our system, a password recovery email has been sent.',
|
||||
'success' => 'إذا كان عنوان البريد الإلكتروني هذا موجود في نظامنا، تم إرسال بريد إلكتروني لاسترداد كلمة المرور.',
|
||||
),
|
||||
|
||||
'forgot-password-confirm' => array(
|
||||
|
||||
@@ -13,5 +13,5 @@ return array(
|
||||
'upload' => 'رفع',
|
||||
'select_file' => 'حدد ملف ...',
|
||||
'select_files' => 'إختيار ملف...',
|
||||
'generate_labels' => '{1} Generate Label|[2,*] Generate Labels',
|
||||
'generate_labels' => '{1} انشاء تسميات [2,*] توليد تسميات',
|
||||
);
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
'bulkaudit' => 'تدقيق متعدد',
|
||||
'bulkaudit_status' => 'حالة التدقيق',
|
||||
'bulk_checkout' => 'اخراج متعدد',
|
||||
'bystatus' => 'by Status',
|
||||
'bystatus' => 'حسب الحالة',
|
||||
'cancel' => 'إلغاء',
|
||||
'categories' => 'التصنيفات',
|
||||
'category' => 'تصنيف',
|
||||
@@ -58,7 +58,7 @@
|
||||
'created' => 'تم إنشاء العنصر',
|
||||
'created_asset' => 'الأصول المضافة',
|
||||
'created_at' => 'أنشئت في',
|
||||
'record_created' => 'Record Created',
|
||||
'record_created' => 'إنشاء سجل',
|
||||
'updated_at' => 'تم التحديث في',
|
||||
'currency' => '$', // this is deprecated
|
||||
'current' => 'الحالي',
|
||||
@@ -79,6 +79,7 @@
|
||||
'depreciation_report' => 'تقرير الإستهلاك',
|
||||
'details' => 'التفاصيل',
|
||||
'download' => 'تحميل',
|
||||
'download_all' => 'Download All',
|
||||
'depreciation' => 'الإستهلاك',
|
||||
'editprofile' => 'تعديل الملف الشخصي',
|
||||
'eol' => 'نهاية العمر',
|
||||
@@ -89,26 +90,20 @@
|
||||
'firstname_lastname_format' => 'الاسم الأول الاسم الأخير (jane.smith@example.com)',
|
||||
'firstname_lastname_underscore_format' => 'الاسم الأول الاسم الأخير (jane_smith@example.com)',
|
||||
'lastnamefirstinitial_format' => 'اللقب والحرف الاول من الاسم (smithj@example.com)',
|
||||
'firstintial_dot_lastname_format' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstintial_dot_lastname_format' => 'الاسم الأخير الأول (jsmith@example.com)',
|
||||
'first' => 'الأول',
|
||||
'firstnamelastname' => 'First Name Last Name (janesmith@example.com)',
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'firstnamelastname' => 'First Name Last Name (janesmith@example.com)',
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'firstnamelastname' => 'الاسم الأول الاسم الأخير (jane.smith@example.com)',
|
||||
'lastname_firstinitial' => 'اللقب والحرف الاول من الاسم (smithj@example.com)',
|
||||
'firstinitial.lastname' => 'الاسم الأخير الأول (jsmith@example.com)',
|
||||
'firstnamelastinitial' => 'اللقب والحرف الاول من الاسم (smithj@example.com)',
|
||||
'first_name' => 'الإسم الأول',
|
||||
'first_name_format' => 'الاسم الأول (jane@example.com)',
|
||||
'files' => 'الملفات',
|
||||
'file_name' => 'ملف',
|
||||
'file_type' => 'File Type',
|
||||
'file_type' => 'نوع الملف',
|
||||
'file_uploads' => 'تحميلات الملفات',
|
||||
'generate' => 'توفير',
|
||||
'github_markdown' => 'This field accepts <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>.',
|
||||
'github_markdown' => 'يتيح هذا الحقل <a href="https://help.github.com/articles/github-flavored-markdown/">بتطبيق نمط الكتابة من Github</a>.',
|
||||
'groups' => 'المجموعات',
|
||||
'gravatar_email' => 'البريد الإلكتروني لخدمة Gravatar',
|
||||
'history' => 'الأرشيف',
|
||||
@@ -119,13 +114,15 @@
|
||||
'image_upload' => 'رفع صورة',
|
||||
'image_filetypes_help' => 'أنواع الملفات المقبولة هي jpg و png و gif و svg. الحد الأقصى لحجم التحميل المسموح به هو: الحجم.',
|
||||
'import' => 'استيراد',
|
||||
'importing' => 'Importing',
|
||||
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
|
||||
'import-history' => 'استيراد الأرشيف',
|
||||
'asset_maintenance' => 'صيانة الأصول',
|
||||
'asset_maintenance_report' => 'تقرير صيانة الأصول',
|
||||
'asset_maintenances' => 'صيانة الأصول',
|
||||
'item' => 'بند',
|
||||
'insufficient_permissions' => 'صلاحيات غير كافية!',
|
||||
'kits' => 'Predefined Kits',
|
||||
'kits' => 'مجموعات محددة مسبقاً',
|
||||
'language' => 'لغة',
|
||||
'last' => 'الاخير',
|
||||
'last_login' => 'آخر تسجيل دخول',
|
||||
@@ -136,11 +133,11 @@
|
||||
'licenses' => 'التراخيص',
|
||||
'list_all' => 'عرض الكل',
|
||||
'loading' => 'جار التحميل',
|
||||
'lock_passwords' => 'This field value will not be saved in a demo installation.',
|
||||
'lock_passwords' => 'لن يتم حفظ قيمة الحقل هذه في تثبيت تجريبي.',
|
||||
'feature_disabled' => 'تم تعطيل هذه الميزة للتثبيت التجريبي.',
|
||||
'location' => 'الموقع',
|
||||
'locations' => 'المواقع',
|
||||
'logo_size' => 'Square logos look best with Logo + Text. Logo maximum display size is 50px high x 500px wide. ',
|
||||
'logo_size' => 'يبدو شعار مربع أفضل مع الشعار + النص. الحد الأقصى لحجم عرض الشعار هو 50 بكسل × 500 بكس. ',
|
||||
'logout' => 'تسجيل خروج',
|
||||
'lookup_by_tag' => 'البحث عن طريق ترميز الأصل',
|
||||
'maintenances' => 'الصيانة',
|
||||
@@ -202,7 +199,7 @@
|
||||
'sign_in' => 'تسجيل الدخول',
|
||||
'signature' => 'التوقيع',
|
||||
'skin' => 'المظهر',
|
||||
'slack_test_msg' => 'Oh hai! Looks like your Slack integration with Snipe-IT is working!',
|
||||
'slack_test_msg' => 'مرحباً! يبدو أن التكامل مع Slack مع Snipe-IT يعمل!',
|
||||
'some_features_disabled' => 'التثبيت التجريبي (DEMO): يتم تعطيل بعض الميزات لهذا التثبيت.',
|
||||
'site_name' => 'إسم الموقع',
|
||||
'state' => 'المنطقة / الولاية',
|
||||
@@ -223,14 +220,14 @@
|
||||
'unknown_admin' => 'إداري غير معروف',
|
||||
'username_format' => 'تنسيق اسم المستخدم',
|
||||
'update' => 'تحديث',
|
||||
'upload_filetypes_help' => 'Allowed filetypes are png, gif, jpg, jpeg, doc, docx, pdf, xls, xlsx, txt, lic, xml, zip, rtf and rar. Max upload size allowed is :size.',
|
||||
'upload_filetypes_help' => 'أنواع الملفات المسموح بها هي png, gif, jpg, jpeg, doc, docx, pdf, xls, xlsx, txt, lic, xml, zip, rtf and rar. الحد الأقصى المسموح به هو :size.',
|
||||
'uploaded' => 'تم تحميلها',
|
||||
'user' => 'المستخدم',
|
||||
'accepted' => 'قبلت',
|
||||
'declined' => 'رفض',
|
||||
'unaccepted_asset_report' => 'الأصول غير المقبولة',
|
||||
'users' => 'المستخدمين',
|
||||
'viewall' => 'View All',
|
||||
'viewall' => 'عرض الكل',
|
||||
'viewassets' => 'عرض الأصول المخرجة',
|
||||
'website' => 'الموقع',
|
||||
'welcome' => 'مرحباً :name',
|
||||
@@ -239,7 +236,12 @@
|
||||
'zip' => 'الرمز البريدي',
|
||||
'noimage' => 'لم يتم تحميل أي صورة أو صورة لم يتم العثور عليها.',
|
||||
'token_expired' => 'انتهت صلاحية جلسة النموذج. حاول مرة اخرى.',
|
||||
'login_enabled' => 'Login Enabled',
|
||||
'audit_due' => 'Due for Audit',
|
||||
'audit_overdue' => 'Overdue for Audit',
|
||||
'login_enabled' => 'تسجيل الدخول مفعل',
|
||||
'audit_due' => 'الواجب مراجعته',
|
||||
'audit_overdue' => 'مراجعة الحسابات المتأخرة',
|
||||
'accept' => 'Accept :asset',
|
||||
'i_accept' => 'I accept',
|
||||
'i_decline' => 'I decline',
|
||||
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
|
||||
'clear_signature' => 'Clear Signature'
|
||||
];
|
||||
|
||||
@@ -13,23 +13,23 @@ return array(
|
||||
|
|
||||
*/
|
||||
|
||||
"more_info_title" => "More Info",
|
||||
"more_info_title" => "المزيد من المعلومات",
|
||||
|
||||
"audit_help" => "Checking this box will edit the asset record to reflect this new location. Leaving it unchecked will simply note the location in the audit log.<br><br>Note that is this asset is checked out, it will not change the location of the person, asset or location it is checked out to.",
|
||||
"audit_help" => "التحقق من هذا المربع سيؤدي إلى تعديل سجل الأصول لعكس هذا الموقع الجديد. تركه غير محدد سيلاحظ ببساطة الموقع في سجل المراجعة.<br><br>لاحظ أن هذا الأصل تم التحقق منه، فهو لن يغير موقع الشخص أو الأصل أو الموقع الذي يتم التحقق منه إليه.",
|
||||
|
||||
'assets' => 'Assets are items tracked by serial number or asset tag. They tend to be higher value items where identifying a specific item matters.',
|
||||
'assets' => 'الأصول هي العناصر التي يتم تتبعها بواسطة الرقم التسلسلي أو ترميز الأصل. وهي تميل إلى أن تكون ممتلكات ذات قيمة أعلى حيث انه من المهم توثيقها.',
|
||||
|
||||
'categories' => 'Categories help you organize your items. Some example categories might be "Desktops", "Laptops", "Mobile Phones", "Tablets", and so on, but you can use categories any way that makes sense for you.',
|
||||
'categories' => 'التصنيفات تساعدك على ترتيب الأصول. من الأمثلة على التصنيفات " حواسيب مكتبية "، " حواسيب محمولة "، "الهواتف النقالة "، "أجهزة لوحية " وهكذا، كما يمكنك استخدام التصنيفات بأي طريقة تناسبك.',
|
||||
|
||||
'accessories' => 'Accessories are anything you issue to users but that do not have a serial number (or you do not care about tracking them uniquely). For example, computer mice or keyboards.',
|
||||
'accessories' => 'الملحقات هي أي شيء تصدره للمستخدمين ولكن ليس لها رقم تسلسلي (أو لا تهتم بتعقبه بشكل فريد). على سبيل المثال، الفئران الحاسوبية أو لوحة المفاتيح.',
|
||||
|
||||
'companies' => 'Companies can be used as a simple identifier field, or can be used to limit visibility of assets, users, etc if full company support is enabled in your Admin settings.',
|
||||
'companies' => 'يمكن استخدام الشركات كمجال بسيط لتحديد الهوية، أو يمكن استخدامها للحد من وضوح الأصول، المستخدمين، إلخ إذا تم تمكين دعم الشركة الكامل في إعدادات المشرف الخاص بك.',
|
||||
|
||||
'components' => 'Components are items that are part of an asset, for example HDD, RAM, etc.',
|
||||
'components' => 'المكونات هي عناصر تشكل جزءا من الأصل، مثل HDD، ذاكرة الوصول العشوائي، إلخ.',
|
||||
|
||||
'consumables' => 'Consumables are anything purchased that will be used up over time. For example, printer ink or copier paper.',
|
||||
'consumables' => 'المواد الاستهلاكية هي أي شيء يتم شراؤه وسيتم استخدامه مع مرور الوقت. على سبيل المثال حبر الطابعة أو ورق آلة النسخ.',
|
||||
|
||||
'depreciations' => 'You can set up asset depreciations to depreciate assets based on straight-line depreciation.',
|
||||
'depreciations' => 'يمكنك إعداد استهلاك الأصول لاستهلاك الأصول بناء على الاستهلاك الثابت للقيمة.',
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -18,12 +18,12 @@ return array(
|
||||
'click_to_confirm' => 'يرجى النقر على الرابط التالي لتأكيد حسابك على :web :',
|
||||
'click_on_the_link_accessory' => 'الرجاء النقر على الرابط الموجود في الأسفل لتأكيد استلامك للملحق.',
|
||||
'click_on_the_link_asset' => 'يرجى النقر على الرابط في الجزء السفلي للتأكد من أنك قد تلقيت مادة العرض.',
|
||||
'Confirm_Asset_Checkin' => 'Asset checkin confirmation',
|
||||
'Confirm_Accessory_Checkin' => 'Accessory checkin confirmation',
|
||||
'Confirm_accessory_delivery' => 'Accessory delivery confirmation',
|
||||
'Confirm_license_delivery' => 'License delivery confirmation',
|
||||
'Confirm_asset_delivery' => 'Asset delivery confirmation',
|
||||
'Confirm_consumable_delivery' => 'Consumable delivery confirmation',
|
||||
'Confirm_Asset_Checkin' => 'تأكيد تسجيل الأصول',
|
||||
'Confirm_Accessory_Checkin' => 'تأكيد تسجيل الأصول',
|
||||
'Confirm_accessory_delivery' => 'تأكيد توصيل الأصول',
|
||||
'Confirm_license_delivery' => 'تأكيد توصيل الرخصة',
|
||||
'Confirm_asset_delivery' => 'تأكيد تسليم الأصول',
|
||||
'Confirm_consumable_delivery' => 'تأكيد التسليم المستهلكة',
|
||||
'current_QTY' => 'الكمية الحالية',
|
||||
'Days' => 'أيام',
|
||||
'days' => 'أيام',
|
||||
@@ -63,11 +63,17 @@ return array(
|
||||
'license_expiring_alert' => 'هنالك :count رخص سوف تنتهي في الأيام :threshold القادمة.',
|
||||
'to_reset' => 'لإعادة تعيين كلمة مرور على :web، رجاءا أكمل هذا النموذج:',
|
||||
'type' => 'اكتب',
|
||||
'upcoming-audits' => 'There is :count asset that is coming up for audit within :threshold days.|There are :count assets that are coming up for audit within :threshold days.',
|
||||
'upcoming-audits' => 'هناك :count الأصل الذي سيأتي للمراجعة في غضون :threshold أيام.<unk> هناك :count أصول ستأتي للمراجعة في غضون :threshold أيام.',
|
||||
'user' => 'المستخدم',
|
||||
'username' => 'اسم المستخدم',
|
||||
'welcome' => 'مرحباً :name',
|
||||
'welcome_to' => 'مرحبا بكم في :web!',
|
||||
'your_credentials' => 'أوراق اعتماد قنص-إيت الخاص بك',
|
||||
|
||||
'Accessory_Checkin_Notification' => 'Accessory checked in',
|
||||
'Asset_Checkin_Notification' => 'Asset checked in',
|
||||
'License_Checkin_Notification' => 'License checked in',
|
||||
'Expected_Checkin_Report' => 'Expected asset checkin report',
|
||||
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
|
||||
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
|
||||
'your_assets' => 'View Your Assets'
|
||||
);
|
||||
|
||||
@@ -83,6 +83,7 @@ return array(
|
||||
'ldap_auth_filter_query' => 'LDAP оторизационна заявка',
|
||||
'ldap_version' => 'LDAP версия',
|
||||
'ldap_active_flag' => 'LDAP флаг за активност',
|
||||
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
|
||||
'ldap_emp_num' => 'LDAP номер на служител',
|
||||
'ldap_email' => 'LDAP електронна поща',
|
||||
'license' => 'Софтуерен лиценз',
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
'depreciation_report' => 'Справка за амортизации',
|
||||
'details' => 'Детайли',
|
||||
'download' => 'Изтегляне',
|
||||
'download_all' => 'Download All',
|
||||
'depreciation' => 'Амортизация',
|
||||
'editprofile' => 'Редакция на профила',
|
||||
'eol' => 'EOL',
|
||||
@@ -95,12 +96,6 @@
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'firstnamelastname' => 'First Name Last Name (janesmith@example.com)',
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'first_name' => 'Собствено име',
|
||||
'first_name_format' => 'Име (jane@example.com)',
|
||||
'files' => 'Файлове',
|
||||
@@ -119,6 +114,8 @@
|
||||
'image_upload' => 'Качване на изображение',
|
||||
'image_filetypes_help' => 'Приеманите типове файлове са jpg, png, gif и svg. Максималният размер за качване е: :size.',
|
||||
'import' => 'Зареждане',
|
||||
'importing' => 'Importing',
|
||||
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
|
||||
'import-history' => 'История на въвеждане',
|
||||
'asset_maintenance' => 'Поддръжка на активи',
|
||||
'asset_maintenance_report' => 'Справка за поддръжка на активи',
|
||||
@@ -242,4 +239,9 @@
|
||||
'login_enabled' => 'Login Enabled',
|
||||
'audit_due' => 'Due for Audit',
|
||||
'audit_overdue' => 'Overdue for Audit',
|
||||
'accept' => 'Accept :asset',
|
||||
'i_accept' => 'I accept',
|
||||
'i_decline' => 'I decline',
|
||||
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
|
||||
'clear_signature' => 'Clear Signature'
|
||||
];
|
||||
|
||||
@@ -69,5 +69,11 @@ return array(
|
||||
'welcome' => 'Добре дошли, :name',
|
||||
'welcome_to' => 'Добре дошли: уеб!',
|
||||
'your_credentials' => 'Вашите идентификационни данни за Snipe-IT',
|
||||
|
||||
'Accessory_Checkin_Notification' => 'Accessory checked in',
|
||||
'Asset_Checkin_Notification' => 'Asset checked in',
|
||||
'License_Checkin_Notification' => 'License checked in',
|
||||
'Expected_Checkin_Report' => 'Expected asset checkin report',
|
||||
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
|
||||
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
|
||||
'your_assets' => 'View Your Assets'
|
||||
);
|
||||
|
||||
@@ -83,6 +83,7 @@ return array(
|
||||
'ldap_auth_filter_query' => 'LDAP ověřovací dotaz',
|
||||
'ldap_version' => 'Verze LDAP',
|
||||
'ldap_active_flag' => 'LDAP Active Flag',
|
||||
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
|
||||
'ldap_emp_num' => 'LDAP číslo zaměstnance',
|
||||
'ldap_email' => 'LDAP email',
|
||||
'license' => 'Softwarová licence',
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
'depreciation_report' => 'Report zastarání',
|
||||
'details' => 'Podrobnosti',
|
||||
'download' => 'Stáhnout',
|
||||
'download_all' => 'Download All',
|
||||
'depreciation' => 'Amortizace',
|
||||
'editprofile' => 'Upravit profil',
|
||||
'eol' => 'Konec životnosti',
|
||||
@@ -95,12 +96,6 @@
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'firstnamelastname' => 'First Name Last Name (janesmith@example.com)',
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'first_name' => 'Jméno',
|
||||
'first_name_format' => 'Jméno (jane@example.com)',
|
||||
'files' => 'Soubory',
|
||||
@@ -119,6 +114,8 @@
|
||||
'image_upload' => 'Nahrát obrázek',
|
||||
'image_filetypes_help' => 'Podporované typy souborů jsou jpg, png, gif, a svg. Velikost může být nejvýše :size.',
|
||||
'import' => 'Import',
|
||||
'importing' => 'Importing',
|
||||
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
|
||||
'import-history' => 'Historie importu',
|
||||
'asset_maintenance' => 'Údržba zařízení',
|
||||
'asset_maintenance_report' => 'Zpráva o údržbě zařízení',
|
||||
@@ -242,4 +239,9 @@
|
||||
'login_enabled' => 'Login Enabled',
|
||||
'audit_due' => 'Due for Audit',
|
||||
'audit_overdue' => 'Overdue for Audit',
|
||||
'accept' => 'Accept :asset',
|
||||
'i_accept' => 'I accept',
|
||||
'i_decline' => 'I decline',
|
||||
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
|
||||
'clear_signature' => 'Clear Signature'
|
||||
];
|
||||
|
||||
@@ -69,5 +69,11 @@ return array(
|
||||
'welcome' => 'Vítej uživateli :name',
|
||||
'welcome_to' => 'Vítejte na :web!',
|
||||
'your_credentials' => 'Vaše pověření Snipe-IT',
|
||||
|
||||
'Accessory_Checkin_Notification' => 'Accessory checked in',
|
||||
'Asset_Checkin_Notification' => 'Asset checked in',
|
||||
'License_Checkin_Notification' => 'License checked in',
|
||||
'Expected_Checkin_Report' => 'Expected asset checkin report',
|
||||
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
|
||||
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
|
||||
'your_assets' => 'View Your Assets'
|
||||
);
|
||||
|
||||
@@ -83,6 +83,7 @@ return array(
|
||||
'ldap_auth_filter_query' => 'Ymholiad dilysu LDAP',
|
||||
'ldap_version' => 'Fersiwn LDAP',
|
||||
'ldap_active_flag' => 'Nodi bod LDAP yn weithredol',
|
||||
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
|
||||
'ldap_emp_num' => 'LDAP Rhif Cyflogai',
|
||||
'ldap_email' => 'Ebost LDAP',
|
||||
'license' => 'Trwydded Meddalwedd',
|
||||
|
||||
@@ -79,6 +79,7 @@
|
||||
'depreciation_report' => 'Adroddiad Dibrisiant',
|
||||
'details' => 'Manylion',
|
||||
'download' => 'Lawrlwytho',
|
||||
'download_all' => 'Download All',
|
||||
'depreciation' => 'Dibrisiant',
|
||||
'editprofile' => 'Golygu eich Proffil',
|
||||
'eol' => 'DB',
|
||||
@@ -95,12 +96,6 @@
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'firstnamelastname' => 'First Name Last Name (janesmith@example.com)',
|
||||
'lastname_firstinitial' => 'Last Name First Initial (smith_j@example.com)',
|
||||
'firstinitial.lastname' => 'First Initial Last Name (j.smith@example.com)',
|
||||
'firstnamelastinitial' => 'First Name Last Initial (janes@example.com)',
|
||||
'first' => 'First',
|
||||
'first_name' => 'Enw cyntaf',
|
||||
'first_name_format' => 'Enw Cyntaf (jane@example.com)',
|
||||
'files' => 'Ffeiliau',
|
||||
@@ -119,6 +114,8 @@
|
||||
'image_upload' => 'Uwchlwytho delwedd',
|
||||
'image_filetypes_help' => 'Mathau o ffeiliau a dderbynnir yw jpg, png, gif, a svg. Maint mwyaf yw :size.',
|
||||
'import' => 'Mewnforio',
|
||||
'importing' => 'Importing',
|
||||
'importing_help' => 'You can import assets, accessories, licenses, components, consumables, and users via CSV file. <br><br>The CSV should be comma-delimited and formatted with headers that match the ones in the <a href="https://snipe-it.readme.io/docs/importing" target="_new">sample CSVs in the documentation</a>.',
|
||||
'import-history' => 'Mewnforio hanes',
|
||||
'asset_maintenance' => 'Cynnal a chadw Ased',
|
||||
'asset_maintenance_report' => 'Adroddiad cynnal a chadw ased',
|
||||
@@ -242,4 +239,9 @@
|
||||
'login_enabled' => 'Login Enabled',
|
||||
'audit_due' => 'Due for Audit',
|
||||
'audit_overdue' => 'Overdue for Audit',
|
||||
'accept' => 'Accept :asset',
|
||||
'i_accept' => 'I accept',
|
||||
'i_decline' => 'I decline',
|
||||
'sign_tos' => 'Sign below to indicate that you agree to the terms of service:',
|
||||
'clear_signature' => 'Clear Signature'
|
||||
];
|
||||
|
||||
@@ -70,5 +70,11 @@ return array(
|
||||
'welcome' => 'Croeso, :name',
|
||||
'welcome_to' => 'Croeso i :web!',
|
||||
'your_credentials' => 'Eich manylion defnyddiwr Snipe-IT',
|
||||
|
||||
'Accessory_Checkin_Notification' => 'Accessory checked in',
|
||||
'Asset_Checkin_Notification' => 'Asset checked in',
|
||||
'License_Checkin_Notification' => 'License checked in',
|
||||
'Expected_Checkin_Report' => 'Expected asset checkin report',
|
||||
'Expected_Checkin_Notification' => 'Reminder: :name checkin deadline approaching',
|
||||
'Expected_Checkin_Date' => 'An asset checked out to you is due to be checked back in on :date',
|
||||
'your_assets' => 'View Your Assets'
|
||||
);
|
||||
|
||||
@@ -83,6 +83,7 @@ return array(
|
||||
'ldap_auth_filter_query' => 'LDAP-godkendelse forespørgsel',
|
||||
'ldap_version' => 'LDAP Version',
|
||||
'ldap_active_flag' => 'LDAP Active Flag',
|
||||
'ldap_activated_flag_help' => 'This flag is used to determine whether a user can login to Snipe-IT and does not affect the ability to check items in or out to them.',
|
||||
'ldap_emp_num' => 'LDAP medarbejdernummer',
|
||||
'ldap_email' => 'LDAP Email',
|
||||
'license' => 'Software licens',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user