Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
e4097ed2
Commit
e4097ed2
authored
Jul 11, 2015
by
Brian Coca
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simplified ansible errors, moved md5 hash import with notes to be more prominent
parent
698b2776
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
24 deletions
+27
-24
lib/ansible/parsing/vault/__init__.py
+27
-24
No files found.
lib/ansible/parsing/vault/__init__.py
View file @
e4097ed2
...
@@ -29,15 +29,17 @@ import shutil
...
@@ -29,15 +29,17 @@ import shutil
import
tempfile
import
tempfile
from
io
import
BytesIO
from
io
import
BytesIO
from
subprocess
import
call
from
subprocess
import
call
from
ansible
import
errors
from
ansible
.errors
import
AnsibleError
from
hashlib
import
sha256
from
hashlib
import
sha256
# Note: Only used for loading obsolete VaultAES files. All files are written
# using the newer VaultAES256 which does not require md5
from
hashlib
import
md5
from
binascii
import
hexlify
from
binascii
import
hexlify
from
binascii
import
unhexlify
from
binascii
import
unhexlify
from
six
import
binary_type
,
PY3
,
text_type
from
six
import
binary_type
,
PY3
,
text_type
# Note: Only used for loading obsolete VaultAES files. All files are written
# using the newer VaultAES256 which does not require md5
from
hashlib
import
md5
try
:
try
:
from
six
import
byte2int
from
six
import
byte2int
except
ImportError
:
except
ImportError
:
...
@@ -88,7 +90,7 @@ CIPHER_WHITELIST=['AES', 'AES256']
...
@@ -88,7 +90,7 @@ CIPHER_WHITELIST=['AES', 'AES256']
def
check_prereqs
():
def
check_prereqs
():
if
not
HAS_AES
or
not
HAS_COUNTER
or
not
HAS_PBKDF2
or
not
HAS_HASH
:
if
not
HAS_AES
or
not
HAS_COUNTER
or
not
HAS_PBKDF2
or
not
HAS_HASH
:
raise
errors
.
AnsibleError
(
CRYPTO_UPGRADE
)
raise
AnsibleError
(
CRYPTO_UPGRADE
)
class
VaultLib
(
object
):
class
VaultLib
(
object
):
...
@@ -108,17 +110,17 @@ class VaultLib(object):
...
@@ -108,17 +110,17 @@ class VaultLib(object):
data
=
to_unicode
(
data
)
data
=
to_unicode
(
data
)
if
self
.
is_encrypted
(
data
):
if
self
.
is_encrypted
(
data
):
raise
errors
.
AnsibleError
(
"data is already encrypted"
)
raise
AnsibleError
(
"data is already encrypted"
)
if
not
self
.
cipher_name
:
if
not
self
.
cipher_name
:
self
.
cipher_name
=
"AES256"
self
.
cipher_name
=
"AES256"
# raise
errors.
AnsibleError("the cipher must be set before encrypting data")
# raise AnsibleError("the cipher must be set before encrypting data")
if
'Vault'
+
self
.
cipher_name
in
globals
()
and
self
.
cipher_name
in
CIPHER_WHITELIST
:
if
'Vault'
+
self
.
cipher_name
in
globals
()
and
self
.
cipher_name
in
CIPHER_WHITELIST
:
cipher
=
globals
()[
'Vault'
+
self
.
cipher_name
]
cipher
=
globals
()[
'Vault'
+
self
.
cipher_name
]
this_cipher
=
cipher
()
this_cipher
=
cipher
()
else
:
else
:
raise
errors
.
AnsibleError
(
"{0} cipher could not be found"
.
format
(
self
.
cipher_name
))
raise
AnsibleError
(
"{0} cipher could not be found"
.
format
(
self
.
cipher_name
))
"""
"""
# combine sha + data
# combine sha + data
...
@@ -137,10 +139,10 @@ class VaultLib(object):
...
@@ -137,10 +139,10 @@ class VaultLib(object):
data
=
to_bytes
(
data
)
data
=
to_bytes
(
data
)
if
self
.
password
is
None
:
if
self
.
password
is
None
:
raise
errors
.
AnsibleError
(
"A vault password must be specified to decrypt data"
)
raise
AnsibleError
(
"A vault password must be specified to decrypt data"
)
if
not
self
.
is_encrypted
(
data
):
if
not
self
.
is_encrypted
(
data
):
raise
errors
.
AnsibleError
(
"data is not encrypted"
)
raise
AnsibleError
(
"data is not encrypted"
)
# clean out header
# clean out header
data
=
self
.
_split_header
(
data
)
data
=
self
.
_split_header
(
data
)
...
@@ -151,12 +153,12 @@ class VaultLib(object):
...
@@ -151,12 +153,12 @@ class VaultLib(object):
cipher
=
globals
()[
'Vault'
+
ciphername
]
cipher
=
globals
()[
'Vault'
+
ciphername
]
this_cipher
=
cipher
()
this_cipher
=
cipher
()
else
:
else
:
raise
errors
.
AnsibleError
(
"{0} cipher could not be found"
.
format
(
ciphername
))
raise
AnsibleError
(
"{0} cipher could not be found"
.
format
(
ciphername
))
# try to unencrypt data
# try to unencrypt data
data
=
this_cipher
.
decrypt
(
data
,
self
.
password
)
data
=
this_cipher
.
decrypt
(
data
,
self
.
password
)
if
data
is
None
:
if
data
is
None
:
raise
errors
.
AnsibleError
(
"Decryption failed"
)
raise
AnsibleError
(
"Decryption failed"
)
return
data
return
data
...
@@ -166,7 +168,7 @@ class VaultLib(object):
...
@@ -166,7 +168,7 @@ class VaultLib(object):
#tmpdata = hexlify(data)
#tmpdata = hexlify(data)
tmpdata
=
[
to_bytes
(
data
[
i
:
i
+
80
])
for
i
in
range
(
0
,
len
(
data
),
80
)]
tmpdata
=
[
to_bytes
(
data
[
i
:
i
+
80
])
for
i
in
range
(
0
,
len
(
data
),
80
)]
if
not
self
.
cipher_name
:
if
not
self
.
cipher_name
:
raise
errors
.
AnsibleError
(
"the cipher must be set before adding a header"
)
raise
AnsibleError
(
"the cipher must be set before adding a header"
)
dirty_data
=
to_bytes
(
HEADER
+
";"
+
self
.
version
+
";"
+
self
.
cipher_name
+
"
\n
"
)
dirty_data
=
to_bytes
(
HEADER
+
";"
+
self
.
version
+
";"
+
self
.
cipher_name
+
"
\n
"
)
for
l
in
tmpdata
:
for
l
in
tmpdata
:
...
@@ -246,7 +248,7 @@ class VaultEditor(object):
...
@@ -246,7 +248,7 @@ class VaultEditor(object):
check_prereqs
()
check_prereqs
()
if
os
.
path
.
isfile
(
self
.
filename
):
if
os
.
path
.
isfile
(
self
.
filename
):
raise
errors
.
AnsibleError
(
"
%
s exists, please use 'edit' instead"
%
self
.
filename
)
raise
AnsibleError
(
"
%
s exists, please use 'edit' instead"
%
self
.
filename
)
# Let the user specify contents and save file
# Let the user specify contents and save file
self
.
_edit_file_helper
(
cipher
=
self
.
cipher_name
)
self
.
_edit_file_helper
(
cipher
=
self
.
cipher_name
)
...
@@ -256,18 +258,18 @@ class VaultEditor(object):
...
@@ -256,18 +258,18 @@ class VaultEditor(object):
check_prereqs
()
check_prereqs
()
if
not
os
.
path
.
isfile
(
self
.
filename
):
if
not
os
.
path
.
isfile
(
self
.
filename
):
raise
errors
.
AnsibleError
(
"
%
s does not exist"
%
self
.
filename
)
raise
AnsibleError
(
"
%
s does not exist"
%
self
.
filename
)
tmpdata
=
self
.
read_data
(
self
.
filename
)
tmpdata
=
self
.
read_data
(
self
.
filename
)
this_vault
=
VaultLib
(
self
.
password
)
this_vault
=
VaultLib
(
self
.
password
)
if
this_vault
.
is_encrypted
(
tmpdata
):
if
this_vault
.
is_encrypted
(
tmpdata
):
dec_data
=
this_vault
.
decrypt
(
tmpdata
)
dec_data
=
this_vault
.
decrypt
(
tmpdata
)
if
dec_data
is
None
:
if
dec_data
is
None
:
raise
errors
.
AnsibleError
(
"Decryption failed"
)
raise
AnsibleError
(
"Decryption failed"
)
else
:
else
:
self
.
write_data
(
dec_data
,
self
.
filename
)
self
.
write_data
(
dec_data
,
self
.
filename
)
else
:
else
:
raise
errors
.
AnsibleError
(
"
%
s is not encrypted"
%
self
.
filename
)
raise
AnsibleError
(
"
%
s is not encrypted"
%
self
.
filename
)
def
edit_file
(
self
):
def
edit_file
(
self
):
...
@@ -305,7 +307,7 @@ class VaultEditor(object):
...
@@ -305,7 +307,7 @@ class VaultEditor(object):
check_prereqs
()
check_prereqs
()
if
not
os
.
path
.
isfile
(
self
.
filename
):
if
not
os
.
path
.
isfile
(
self
.
filename
):
raise
errors
.
AnsibleError
(
"
%
s does not exist"
%
self
.
filename
)
raise
AnsibleError
(
"
%
s does not exist"
%
self
.
filename
)
tmpdata
=
self
.
read_data
(
self
.
filename
)
tmpdata
=
self
.
read_data
(
self
.
filename
)
this_vault
=
VaultLib
(
self
.
password
)
this_vault
=
VaultLib
(
self
.
password
)
...
@@ -314,7 +316,7 @@ class VaultEditor(object):
...
@@ -314,7 +316,7 @@ class VaultEditor(object):
enc_data
=
this_vault
.
encrypt
(
tmpdata
)
enc_data
=
this_vault
.
encrypt
(
tmpdata
)
self
.
write_data
(
enc_data
,
self
.
filename
)
self
.
write_data
(
enc_data
,
self
.
filename
)
else
:
else
:
raise
errors
.
AnsibleError
(
"
%
s is already encrypted"
%
self
.
filename
)
raise
AnsibleError
(
"
%
s is already encrypted"
%
self
.
filename
)
def
rekey_file
(
self
,
new_password
):
def
rekey_file
(
self
,
new_password
):
...
@@ -375,11 +377,11 @@ class VaultFile(object):
...
@@ -375,11 +377,11 @@ class VaultFile(object):
self
.
filename
=
filename
self
.
filename
=
filename
if
not
os
.
path
.
isfile
(
self
.
filename
):
if
not
os
.
path
.
isfile
(
self
.
filename
):
raise
errors
.
AnsibleError
(
"
%
s does not exist"
%
self
.
filename
)
raise
AnsibleError
(
"
%
s does not exist"
%
self
.
filename
)
try
:
try
:
self
.
filehandle
=
open
(
filename
,
"rb"
)
self
.
filehandle
=
open
(
filename
,
"rb"
)
except
Exception
as
e
:
except
Exception
as
e
:
raise
errors
.
AnsibleError
(
"Could not open
%
s:
%
s"
%
(
self
.
filename
,
str
(
e
)))
raise
AnsibleError
(
"Could not open
%
s:
%
s"
%
(
self
.
filename
,
str
(
e
)))
_
,
self
.
tmpfile
=
tempfile
.
mkstemp
()
_
,
self
.
tmpfile
=
tempfile
.
mkstemp
()
...
@@ -403,7 +405,7 @@ class VaultFile(object):
...
@@ -403,7 +405,7 @@ class VaultFile(object):
this_vault
=
VaultLib
(
self
.
password
)
this_vault
=
VaultLib
(
self
.
password
)
dec_data
=
this_vault
.
decrypt
(
tmpdata
)
dec_data
=
this_vault
.
decrypt
(
tmpdata
)
if
dec_data
is
None
:
if
dec_data
is
None
:
raise
errors
.
AnsibleError
(
"Decryption failed"
)
raise
AnsibleError
(
"Decryption failed"
)
else
:
else
:
self
.
tempfile
.
write
(
dec_data
)
self
.
tempfile
.
write
(
dec_data
)
return
self
.
tmpfile
return
self
.
tmpfile
...
@@ -423,7 +425,7 @@ class VaultAES(object):
...
@@ -423,7 +425,7 @@ class VaultAES(object):
def
__init__
(
self
):
def
__init__
(
self
):
if
not
HAS_AES
:
if
not
HAS_AES
:
raise
errors
.
AnsibleError
(
CRYPTO_UPGRADE
)
raise
AnsibleError
(
CRYPTO_UPGRADE
)
def
aes_derive_key_and_iv
(
self
,
password
,
salt
,
key_length
,
iv_length
):
def
aes_derive_key_and_iv
(
self
,
password
,
salt
,
key_length
,
iv_length
):
...
@@ -527,7 +529,7 @@ class VaultAES(object):
...
@@ -527,7 +529,7 @@ class VaultAES(object):
test_sha
=
sha256
(
to_bytes
(
this_data
))
.
hexdigest
()
test_sha
=
sha256
(
to_bytes
(
this_data
))
.
hexdigest
()
if
this_sha
!=
test_sha
:
if
this_sha
!=
test_sha
:
raise
errors
.
AnsibleError
(
"Decryption failed"
)
raise
AnsibleError
(
"Decryption failed"
)
return
this_data
return
this_data
...
@@ -652,3 +654,4 @@ class VaultAES256(object):
...
@@ -652,3 +654,4 @@ class VaultAES256(object):
else
:
else
:
result
|=
ord
(
x
)
^
ord
(
y
)
result
|=
ord
(
x
)
^
ord
(
y
)
return
result
==
0
return
result
==
0
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment