cifrado 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/.gitignore +18 -0
- data/CHANGELOG.md +44 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +247 -0
- data/RELEASE.md +10 -0
- data/Rakefile +21 -0
- data/TODO.md +6 -0
- data/bin/cifrado +7 -0
- data/cifrado.gemspec +31 -0
- data/gem-public_cert.pem +20 -0
- data/lib/cifrado.rb +48 -0
- data/lib/cifrado/cli.rb +140 -0
- data/lib/cifrado/cli/cinema.rb +81 -0
- data/lib/cifrado/cli/delete.rb +36 -0
- data/lib/cifrado/cli/download.rb +54 -0
- data/lib/cifrado/cli/jukebox.rb +94 -0
- data/lib/cifrado/cli/list.rb +64 -0
- data/lib/cifrado/cli/post.rb +10 -0
- data/lib/cifrado/cli/progressbar.rb +86 -0
- data/lib/cifrado/cli/saio.rb +11 -0
- data/lib/cifrado/cli/saio/base.rb +20 -0
- data/lib/cifrado/cli/saio/bootstrap.rb +118 -0
- data/lib/cifrado/cli/saio/destroy.rb +16 -0
- data/lib/cifrado/cli/saio/scripts/saio.sh.erb +445 -0
- data/lib/cifrado/cli/set_acl.rb +10 -0
- data/lib/cifrado/cli/setup.rb +64 -0
- data/lib/cifrado/cli/stat.rb +41 -0
- data/lib/cifrado/cli/upload.rb +269 -0
- data/lib/cifrado/config.rb +18 -0
- data/lib/cifrado/core_ext/ruby18_base64.rb +15 -0
- data/lib/cifrado/crypto_services.rb +218 -0
- data/lib/cifrado/file_splitter.rb +67 -0
- data/lib/cifrado/rate_limit.rb +23 -0
- data/lib/cifrado/streaming_downloader.rb +49 -0
- data/lib/cifrado/streaming_uploader.rb +57 -0
- data/lib/cifrado/swift_client.rb +313 -0
- data/lib/cifrado/utils.rb +59 -0
- data/lib/cifrado/version.rb +3 -0
- data/tests/cli/list_tests.rb +28 -0
- data/tests/cli/upload_multi_tests.rb +94 -0
- data/tests/cli/upload_tests.rb +167 -0
- data/tests/cli_tests.rb +2 -0
- data/tests/crypto_services_tests.rb +145 -0
- data/tests/file_splitter_tests.rb +61 -0
- data/tests/helper.rb +117 -0
- data/tests/swift_client/create_directory.rb +14 -0
- data/tests/swift_client/download_tests.rb +208 -0
- data/tests/swift_client/file_available.rb +25 -0
- data/tests/swift_client/head_tests.rb +34 -0
- data/tests/swift_client/match_tests.rb +29 -0
- data/tests/swift_client/upload_tests.rb +70 -0
- data/tests/swift_client_tests.rb +29 -0
- data/tests/utils_tests.rb +33 -0
- data/vendor/fog/.document +3 -0
- data/vendor/fog/.gitignore +23 -0
- data/vendor/fog/.irbrc +82 -0
- data/vendor/fog/.travis.yml +21 -0
- data/vendor/fog/README.cifrado +3 -0
- data/vendor/fog/README.md +156 -0
- data/vendor/fog/RELEASE.md +39 -0
- data/vendor/fog/changelog.txt +4156 -0
- data/vendor/fog/fog.gemspec +70 -0
- data/vendor/fog/lib/fog.rb +17 -0
- data/vendor/fog/lib/fog/cdn.rb +30 -0
- data/vendor/fog/lib/fog/compute.rb +127 -0
- data/vendor/fog/lib/fog/compute/models/server.rb +73 -0
- data/vendor/fog/lib/fog/core.rb +38 -0
- data/vendor/fog/lib/fog/core/attributes.rb +221 -0
- data/vendor/fog/lib/fog/core/collection.rb +145 -0
- data/vendor/fog/lib/fog/core/connection.rb +36 -0
- data/vendor/fog/lib/fog/core/credentials.rb +65 -0
- data/vendor/fog/lib/fog/core/current_machine.rb +34 -0
- data/vendor/fog/lib/fog/core/deprecated_connection_accessors.rb +41 -0
- data/vendor/fog/lib/fog/core/deprecation.rb +23 -0
- data/vendor/fog/lib/fog/core/errors.rb +108 -0
- data/vendor/fog/lib/fog/core/hmac.rb +48 -0
- data/vendor/fog/lib/fog/core/json.rb +34 -0
- data/vendor/fog/lib/fog/core/logger.rb +45 -0
- data/vendor/fog/lib/fog/core/mock.rb +92 -0
- data/vendor/fog/lib/fog/core/model.rb +79 -0
- data/vendor/fog/lib/fog/core/parser.rb +116 -0
- data/vendor/fog/lib/fog/core/provider.rb +35 -0
- data/vendor/fog/lib/fog/core/scp.rb +96 -0
- data/vendor/fog/lib/fog/core/service.rb +223 -0
- data/vendor/fog/lib/fog/core/ssh.rb +137 -0
- data/vendor/fog/lib/fog/core/time.rb +32 -0
- data/vendor/fog/lib/fog/core/timeout.rb +11 -0
- data/vendor/fog/lib/fog/core/wait_for.rb +15 -0
- data/vendor/fog/lib/fog/digitalocean.rb +9 -0
- data/vendor/fog/lib/fog/digitalocean/compute.rb +100 -0
- data/vendor/fog/lib/fog/digitalocean/examples/getting_started.md +106 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/flavor.rb +14 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/flavors.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/image.rb +15 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/images.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/region.rb +14 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/regions.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/server.rb +150 -0
- data/vendor/fog/lib/fog/digitalocean/models/compute/servers.rb +27 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/create_server.rb +49 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/create_ssh_key.rb +26 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/destroy_server.rb +28 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/get_server_details.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/list_flavors.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/list_images.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/list_regions.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/list_servers.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/list_ssh_keys.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/power_cycle_server.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/power_off_server.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/power_on_server.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/reboot_server.rb +25 -0
- data/vendor/fog/lib/fog/digitalocean/requests/compute/shutdown_server.rb +25 -0
- data/vendor/fog/lib/fog/dns.rb +59 -0
- data/vendor/fog/lib/fog/identity.rb +27 -0
- data/vendor/fog/lib/fog/image.rb +24 -0
- data/vendor/fog/lib/fog/local.rb +11 -0
- data/vendor/fog/lib/fog/local/models/storage/directories.rb +33 -0
- data/vendor/fog/lib/fog/local/models/storage/directory.rb +57 -0
- data/vendor/fog/lib/fog/local/models/storage/file.rb +131 -0
- data/vendor/fog/lib/fog/local/models/storage/files.rb +87 -0
- data/vendor/fog/lib/fog/local/storage.rb +103 -0
- data/vendor/fog/lib/fog/network.rb +26 -0
- data/vendor/fog/lib/fog/openstack.rb +214 -0
- data/vendor/fog/lib/fog/openstack/README.identity.md +69 -0
- data/vendor/fog/lib/fog/openstack/compute.rb +423 -0
- data/vendor/fog/lib/fog/openstack/identity.rb +299 -0
- data/vendor/fog/lib/fog/openstack/image.rb +217 -0
- data/vendor/fog/lib/fog/openstack/models/compute/address.rb +71 -0
- data/vendor/fog/lib/fog/openstack/models/compute/addresses.rb +33 -0
- data/vendor/fog/lib/fog/openstack/models/compute/flavor.rb +45 -0
- data/vendor/fog/lib/fog/openstack/models/compute/flavors.rb +28 -0
- data/vendor/fog/lib/fog/openstack/models/compute/host.rb +29 -0
- data/vendor/fog/lib/fog/openstack/models/compute/hosts.rb +32 -0
- data/vendor/fog/lib/fog/openstack/models/compute/image.rb +58 -0
- data/vendor/fog/lib/fog/openstack/models/compute/images.rb +33 -0
- data/vendor/fog/lib/fog/openstack/models/compute/key_pair.rb +60 -0
- data/vendor/fog/lib/fog/openstack/models/compute/key_pairs.rb +31 -0
- data/vendor/fog/lib/fog/openstack/models/compute/metadata.rb +68 -0
- data/vendor/fog/lib/fog/openstack/models/compute/metadatum.rb +29 -0
- data/vendor/fog/lib/fog/openstack/models/compute/network.rb +13 -0
- data/vendor/fog/lib/fog/openstack/models/compute/networks.rb +29 -0
- data/vendor/fog/lib/fog/openstack/models/compute/security_group.rb +44 -0
- data/vendor/fog/lib/fog/openstack/models/compute/security_groups.rb +27 -0
- data/vendor/fog/lib/fog/openstack/models/compute/server.rb +278 -0
- data/vendor/fog/lib/fog/openstack/models/compute/servers.rb +44 -0
- data/vendor/fog/lib/fog/openstack/models/compute/snapshot.rb +44 -0
- data/vendor/fog/lib/fog/openstack/models/compute/snapshots.rb +26 -0
- data/vendor/fog/lib/fog/openstack/models/compute/tenant.rb +24 -0
- data/vendor/fog/lib/fog/openstack/models/compute/tenants.rb +24 -0
- data/vendor/fog/lib/fog/openstack/models/compute/volume.rb +59 -0
- data/vendor/fog/lib/fog/openstack/models/compute/volumes.rb +26 -0
- data/vendor/fog/lib/fog/openstack/models/identity/ec2_credential.rb +44 -0
- data/vendor/fog/lib/fog/openstack/models/identity/ec2_credentials.rb +53 -0
- data/vendor/fog/lib/fog/openstack/models/identity/role.rb +50 -0
- data/vendor/fog/lib/fog/openstack/models/identity/roles.rb +21 -0
- data/vendor/fog/lib/fog/openstack/models/identity/tenant.rb +62 -0
- data/vendor/fog/lib/fog/openstack/models/identity/tenants.rb +29 -0
- data/vendor/fog/lib/fog/openstack/models/identity/user.rb +70 -0
- data/vendor/fog/lib/fog/openstack/models/identity/users.rb +32 -0
- data/vendor/fog/lib/fog/openstack/models/image/image.rb +91 -0
- data/vendor/fog/lib/fog/openstack/models/image/images.rb +60 -0
- data/vendor/fog/lib/fog/openstack/models/meta_parent.rb +33 -0
- data/vendor/fog/lib/fog/openstack/models/network/floating_ip.rb +52 -0
- data/vendor/fog/lib/fog/openstack/models/network/floating_ips.rb +34 -0
- data/vendor/fog/lib/fog/openstack/models/network/network.rb +47 -0
- data/vendor/fog/lib/fog/openstack/models/network/networks.rb +34 -0
- data/vendor/fog/lib/fog/openstack/models/network/port.rb +53 -0
- data/vendor/fog/lib/fog/openstack/models/network/ports.rb +34 -0
- data/vendor/fog/lib/fog/openstack/models/network/subnet.rb +56 -0
- data/vendor/fog/lib/fog/openstack/models/network/subnets.rb +34 -0
- data/vendor/fog/lib/fog/openstack/models/storage/directories.rb +39 -0
- data/vendor/fog/lib/fog/openstack/models/storage/directory.rb +50 -0
- data/vendor/fog/lib/fog/openstack/models/storage/file.rb +152 -0
- data/vendor/fog/lib/fog/openstack/models/storage/files.rb +94 -0
- data/vendor/fog/lib/fog/openstack/models/volume/volume.rb +47 -0
- data/vendor/fog/lib/fog/openstack/models/volume/volumes.rb +27 -0
- data/vendor/fog/lib/fog/openstack/network.rb +247 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/add_fixed_ip.rb +29 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/allocate_address.rb +42 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/associate_address.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/attach_volume.rb +38 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/boot_from_snapshot.rb +41 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/change_server_password.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/confirm_resize_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_flavor.rb +85 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_image.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_key_pair.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_security_group.rb +52 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_security_group_rule.rb +59 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_server.rb +131 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_volume.rb +54 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/create_volume_snapshot.rb +47 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_flavor.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_image.rb +40 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_key_pair.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_metadata.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_security_group.rb +33 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_security_group_rule.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_server.rb +38 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_snapshot.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/delete_volume.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/detach_volume.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/disassociate_address.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_address.rb +41 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_console_output.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_flavor_details.rb +43 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_host_details.rb +74 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_image_details.rb +33 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_limits.rb +93 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_metadata.rb +29 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_quota.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_quota_defaults.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_security_group.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_server_details.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_server_volumes.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_snapshot_details.rb +39 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_usage.rb +53 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_vnc_console.rb +40 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/get_volume_details.rb +42 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_address_pools.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_addresses.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_all_addresses.rb +64 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_flavors.rb +38 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_flavors_detail.rb +38 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_hosts.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_images.rb +33 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_images_detail.rb +39 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_key_pairs.rb +39 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_metadata.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_private_addresses.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_public_addresses.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_security_groups.rb +50 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_servers.rb +37 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_servers_detail.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_snapshots.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_tenants.rb +45 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_usages.rb +43 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/list_volumes.rb +51 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/live_migrate_server.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/migrate_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/pause_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/reboot_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/rebuild_server.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/release_address.rb +34 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/remove_fixed_ip.rb +29 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/rescue_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/reset_server_state.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/resize_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/resume_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/revert_resize_server.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/server_action.rb +18 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/server_actions.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/server_diagnostics.rb +25 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/set_metadata.rb +45 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/set_tenant.rb +21 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/suspend_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/unpause_server.rb +24 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/update_metadata.rb +46 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/update_quota.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/compute/update_server.rb +35 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/add_user_to_tenant.rb +34 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/check_token.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/create_ec2_credential.rb +58 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/create_role.rb +37 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/create_tenant.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/create_user.rb +47 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/create_user_role.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/delete_ec2_credential.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/delete_role.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/delete_tenant.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/delete_user.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/delete_user_role.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_ec2_credential.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_role.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_tenant.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_tenants_by_id.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_tenants_by_name.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_user_by_id.rb +34 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/get_user_by_name.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_ec2_credentials.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_endpoints_for_token.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_roles.rb +36 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_roles_for_user_on_tenant.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_tenants.rb +45 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_user_global_roles.rb +22 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/list_users.rb +34 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/remove_user_from_tenant.rb +20 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/set_tenant.rb +21 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/update_tenant.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/update_user.rb +36 -0
- data/vendor/fog/lib/fog/openstack/requests/identity/validate_token.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/image/add_member_to_image.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/image/create_image.rb +79 -0
- data/vendor/fog/lib/fog/openstack/requests/image/delete_image.rb +25 -0
- data/vendor/fog/lib/fog/openstack/requests/image/get_image.rb +45 -0
- data/vendor/fog/lib/fog/openstack/requests/image/get_image_by_id.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/image/get_image_members.rb +29 -0
- data/vendor/fog/lib/fog/openstack/requests/image/get_shared_images.rb +29 -0
- data/vendor/fog/lib/fog/openstack/requests/image/list_public_images.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/image/list_public_images_detailed.rb +31 -0
- data/vendor/fog/lib/fog/openstack/requests/image/remove_member_from_image.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/image/set_tenant.rb +21 -0
- data/vendor/fog/lib/fog/openstack/requests/image/update_image.rb +70 -0
- data/vendor/fog/lib/fog/openstack/requests/image/update_image_members.rb +37 -0
- data/vendor/fog/lib/fog/openstack/requests/network/associate_floating_ip.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/network/create_floating_ip.rb +50 -0
- data/vendor/fog/lib/fog/openstack/requests/network/create_network.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/network/create_port.rb +52 -0
- data/vendor/fog/lib/fog/openstack/requests/network/create_subnet.rb +56 -0
- data/vendor/fog/lib/fog/openstack/requests/network/delete_floating_ip.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/network/delete_network.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/network/delete_port.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/network/delete_subnet.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/network/disassociate_floating_ip.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/network/get_floating_ip.rb +42 -0
- data/vendor/fog/lib/fog/openstack/requests/network/get_network.rb +42 -0
- data/vendor/fog/lib/fog/openstack/requests/network/get_port.rb +48 -0
- data/vendor/fog/lib/fog/openstack/requests/network/get_subnet.rb +49 -0
- data/vendor/fog/lib/fog/openstack/requests/network/list_floating_ips.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/network/list_networks.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/network/list_ports.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/network/list_subnets.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/network/set_tenant.rb +21 -0
- data/vendor/fog/lib/fog/openstack/requests/network/update_network.rb +41 -0
- data/vendor/fog/lib/fog/openstack/requests/network/update_port.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/network/update_subnet.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/copy_object.rb +27 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/delete_container.rb +22 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/delete_object.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/get_container.rb +44 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/get_containers.rb +33 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/get_object.rb +29 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/get_object_https_url.rb +51 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/head_container.rb +28 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/head_containers.rb +25 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/head_object.rb +23 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/post_set_meta_temp_url_key.rb +37 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/put_container.rb +22 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/put_object.rb +30 -0
- data/vendor/fog/lib/fog/openstack/requests/storage/put_object_manifest.rb +25 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/create_volume.rb +54 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/create_volume_snapshot.rb +47 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/delete_snapshot.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/delete_volume.rb +26 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/get_snapshot_details.rb +39 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/get_volume_details.rb +42 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/list_snapshots.rb +32 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/list_volumes.rb +55 -0
- data/vendor/fog/lib/fog/openstack/requests/volume/set_tenant.rb +21 -0
- data/vendor/fog/lib/fog/openstack/storage.rb +162 -0
- data/vendor/fog/lib/fog/openstack/volume.rb +219 -0
- data/vendor/fog/lib/fog/providers.rb +2 -0
- data/vendor/fog/lib/fog/schema/data_validator.rb +154 -0
- data/vendor/fog/lib/fog/storage.rb +97 -0
- data/vendor/fog/lib/fog/version.rb +3 -0
- data/vendor/fog/lib/fog/volume.rb +25 -0
- metadata +576 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
module Cifrado
|
2
|
+
class CLI
|
3
|
+
desc "set-acl CONTAINER", 'Set an ACL on containers and objects'
|
4
|
+
option :acl, :type => :string, :required => true
|
5
|
+
def set_acl(container, object = nil)
|
6
|
+
client = client_instance
|
7
|
+
client.set_acl options[:acl], container
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Cifrado
|
2
|
+
class CLI
|
3
|
+
desc "setup", "Initial Cifrado configuration"
|
4
|
+
def setup
|
5
|
+
config_file = File.join(ENV['HOME'], '.config/cifrado/cifradorc')
|
6
|
+
unless File.directory?('.config/cifrado')
|
7
|
+
FileUtils.mkdir_p '.config/cifrado'
|
8
|
+
end
|
9
|
+
if File.exist?(config_file)
|
10
|
+
Log.warn "Config file #{set_color config_file, :bold} already exist."
|
11
|
+
Log.warn "IMPORTANT: Make sure you backup the current config"
|
12
|
+
Log.warn "before saving a new configuration."
|
13
|
+
unless yes? "Continue?"
|
14
|
+
return
|
15
|
+
end
|
16
|
+
config = YAML.load_file(config_file)
|
17
|
+
else
|
18
|
+
config = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
puts "Running cifrado setup..."
|
23
|
+
puts "Please provide OpenStack/Rackspace credentials."
|
24
|
+
puts
|
25
|
+
puts "Cifrado can save this settings in #{config_file}"
|
26
|
+
puts "for later use."
|
27
|
+
puts "The settings (password included) are saved unencrypted."
|
28
|
+
puts
|
29
|
+
config[:username] = ask(set_color('Username:', :bold))
|
30
|
+
config[:tenant] = ask(set_color('Tenant:', :bold))
|
31
|
+
system 'stty -echo'
|
32
|
+
config[:password] = ask(set_color 'Password:', :bold)
|
33
|
+
system 'stty echo'
|
34
|
+
puts
|
35
|
+
config[:auth_url] = ask(set_color 'Auth URL:', :bold)
|
36
|
+
|
37
|
+
if !config[:secure_random]
|
38
|
+
# shit happens
|
39
|
+
if RUBY_VERSION >= '1.9'
|
40
|
+
config[:secure_random] = SecureRandom.hex.encode('UTF-8')
|
41
|
+
else
|
42
|
+
config[:secure_random] = SecureRandom.hex
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if yes? "Do you want to save these settings? (y/n) "
|
47
|
+
if File.exist?(config_file)
|
48
|
+
backup = "#{config_file}.bak.#{Time.now.to_i}"
|
49
|
+
FileUtils.cp config_file, backup
|
50
|
+
Log.info "Saving backup file to #{backup}."
|
51
|
+
end
|
52
|
+
File.open(config_file, 'w') do |f|
|
53
|
+
f.puts config.to_yaml
|
54
|
+
f.chmod 0600
|
55
|
+
end
|
56
|
+
@settings_saved = true
|
57
|
+
Log.info "Saved!"
|
58
|
+
end
|
59
|
+
|
60
|
+
Log.debug "Setup done"
|
61
|
+
config
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Cifrado
|
2
|
+
class CLI
|
3
|
+
desc "stat [CONTAINER] [OBJECT]", "Displays information for the account, container, or object."
|
4
|
+
def stat(container = nil, object = nil)
|
5
|
+
client = client_instance
|
6
|
+
creds = client.service.credentials
|
7
|
+
mgmt_url = creds[:server_management_url]
|
8
|
+
|
9
|
+
reject_headers = ['Accept-Ranges', 'X-Trans-Id']
|
10
|
+
unless container and object
|
11
|
+
reject_headers << 'Content-Length'
|
12
|
+
end
|
13
|
+
reject_headers << 'Content-Type' unless object
|
14
|
+
|
15
|
+
object = clean_object_name(object) if object
|
16
|
+
headers = client.head(container, object)
|
17
|
+
if headers
|
18
|
+
puts "Account:".ljust(30) + File.basename(URI.parse(mgmt_url).path)
|
19
|
+
headers.sort.each do |k, v|
|
20
|
+
next if reject_headers.include?(k)
|
21
|
+
if k == 'X-Timestamp'
|
22
|
+
puts "#{(k + ":").ljust(30)}#{v} (#{unix_time(v)})"
|
23
|
+
elsif k == 'X-Account-Bytes-Used' or k == 'Content-Length'
|
24
|
+
puts "#{(k + ":").ljust(30)}#{v} (#{humanize_bytes(v)})"
|
25
|
+
elsif k == 'X-Object-Meta-Encrypted-Name'
|
26
|
+
puts "#{(k + ":").ljust(30)}#{v}"
|
27
|
+
else
|
28
|
+
puts "#{(k + ":").ljust(30)}#{v}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
if object
|
33
|
+
raise "Object not found."
|
34
|
+
else
|
35
|
+
raise "Container not found."
|
36
|
+
end
|
37
|
+
end
|
38
|
+
headers
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,269 @@
|
|
1
|
+
module Cifrado
|
2
|
+
class CLI
|
3
|
+
|
4
|
+
desc "upload CONTAINER FILE1 [FILE2] ...",
|
5
|
+
"Upload files or directories"
|
6
|
+
option :encrypt,
|
7
|
+
:desc => 'Encrypt files when uploading'
|
8
|
+
|
9
|
+
option :segments,
|
10
|
+
:type => :numeric,
|
11
|
+
:desc => "Split the data into segments"
|
12
|
+
|
13
|
+
option :strip_path,
|
14
|
+
:type => :boolean,
|
15
|
+
:desc => 'Strip path from file when uploading'
|
16
|
+
|
17
|
+
option :progressbar,
|
18
|
+
:default => :fancy,
|
19
|
+
:desc => 'Progressbar style'
|
20
|
+
|
21
|
+
option :bwlimit,
|
22
|
+
:type => :numeric,
|
23
|
+
:desc => 'Limit the bandwidth available for uploads'
|
24
|
+
|
25
|
+
option :force,
|
26
|
+
:type => :boolean,
|
27
|
+
:desc => 'Overwrite files when uploading'
|
28
|
+
def upload(container, *args)
|
29
|
+
|
30
|
+
if args.empty?
|
31
|
+
help 'upload'
|
32
|
+
raise "No files specified"
|
33
|
+
end
|
34
|
+
|
35
|
+
client = client_instance
|
36
|
+
|
37
|
+
uploaded = []
|
38
|
+
args.each do |file|
|
39
|
+
unless file and File.exist?(file)
|
40
|
+
raise "File '#{file}' does not exist"
|
41
|
+
end
|
42
|
+
|
43
|
+
if File.directory?(file)
|
44
|
+
files = Dir["#{file}/**/*"].reject { |f| File.directory?(f) }
|
45
|
+
else
|
46
|
+
files = [file]
|
47
|
+
end
|
48
|
+
|
49
|
+
files.each do |f|
|
50
|
+
begin
|
51
|
+
if options[:segments]
|
52
|
+
uploaded << split_and_upload(client, container, f)
|
53
|
+
else
|
54
|
+
headers = client.head container, clean_object_name(f)
|
55
|
+
if headers
|
56
|
+
if headers['Etag'] == Digest::MD5.file(f).to_s
|
57
|
+
if options[:force]
|
58
|
+
Log.warn "File #{f} already uploaded and MD5 matches."
|
59
|
+
Log.warn "Since --force was used, uploading it again."
|
60
|
+
uploaded << upload_single(client, container, f)
|
61
|
+
else
|
62
|
+
Log.warn "File #{f} already uploaded and MD5 matches, skipping."
|
63
|
+
end
|
64
|
+
else
|
65
|
+
Log.warn "File #{f} already uploaded, but it has changed."
|
66
|
+
if options[:force]
|
67
|
+
Log.warn "Overwriting it as requested (--force)."
|
68
|
+
uploaded << upload_single(client, container, f)
|
69
|
+
else
|
70
|
+
Log.warn "Since --force was not used, skipping it."
|
71
|
+
end
|
72
|
+
end
|
73
|
+
else
|
74
|
+
uploaded << upload_single(client, container, f)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
rescue Errno::ENOENT => e
|
78
|
+
Log.error "Error uploading #{f}: " + e.message
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
uploaded.flatten
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
def upload_single(client, container, object)
|
87
|
+
fsize = File.size(object)
|
88
|
+
fbasename = File.basename(object)
|
89
|
+
Log.info "Uploading #{object} (#{humanize_bytes(fsize)})"
|
90
|
+
|
91
|
+
pb = Progressbar.new 1, 1, :style => options[:progressbar]
|
92
|
+
|
93
|
+
config = Cifrado::Config.instance
|
94
|
+
object_path = object
|
95
|
+
object_path = File.basename(object) if options[:strip_path]
|
96
|
+
if cs = needs_encryption
|
97
|
+
encrypted_file = File.join(config.cache_dir, File.basename(object))
|
98
|
+
Log.debug "Writing encrypted file to #{encrypted_file}"
|
99
|
+
encrypted_output = cs.encrypt object,
|
100
|
+
encrypted_file
|
101
|
+
encrypted_name = encrypt_filename object, secure_password
|
102
|
+
client.upload container,
|
103
|
+
encrypted_output,
|
104
|
+
:headers => {
|
105
|
+
'X-Object-Meta-Encrypted-Name' => encrypted_name
|
106
|
+
},
|
107
|
+
:object_path => File.basename(encrypted_output),
|
108
|
+
:progress_callback => pb.block,
|
109
|
+
:bwlimit => bwlimit
|
110
|
+
object_path = File.basename(encrypted_output)
|
111
|
+
File.delete encrypted_output
|
112
|
+
else
|
113
|
+
client.upload container,
|
114
|
+
object,
|
115
|
+
:object_path => object_path,
|
116
|
+
:progress_callback => pb.block,
|
117
|
+
:bwlimit => bwlimit
|
118
|
+
end
|
119
|
+
object_path
|
120
|
+
end
|
121
|
+
|
122
|
+
def needs_encryption
|
123
|
+
return nil unless options[:encrypt]
|
124
|
+
|
125
|
+
tokens = options[:encrypt].split(':')
|
126
|
+
etype = tokens.first
|
127
|
+
if etype == 'a'
|
128
|
+
recipient = tokens[1..-1].join(':')
|
129
|
+
CryptoServices.new :type => :asymmetric,
|
130
|
+
:recipient => recipient,
|
131
|
+
:encrypt_name => true
|
132
|
+
elsif etype == 's' or etype == 'symmetric'
|
133
|
+
if etype == 'symmetric'
|
134
|
+
Log.info "Password to encrypt the data required"
|
135
|
+
system 'stty -echo'
|
136
|
+
passphrase = ask("Enter passphrase:")
|
137
|
+
puts
|
138
|
+
passphrase2 = ask("Repeat passphrase:")
|
139
|
+
puts
|
140
|
+
if passphrase != passphrase2
|
141
|
+
raise 'Passphrase does not match'
|
142
|
+
end
|
143
|
+
system 'stty echo'
|
144
|
+
else
|
145
|
+
passphrase = tokens[1..-1].join(':')
|
146
|
+
end
|
147
|
+
unless passphrase
|
148
|
+
raise "Invalid symmetric encryption passprase"
|
149
|
+
end
|
150
|
+
CryptoServices.new :type => :symmetric,
|
151
|
+
:passphrase => passphrase,
|
152
|
+
:encrypt_name => true
|
153
|
+
else
|
154
|
+
raise "Invalid encryption type #{etype}."
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def encrypt_if_required(file)
|
159
|
+
if cs = needs_encryption
|
160
|
+
Log.debug "Encrypting object #{file}"
|
161
|
+
cache_dir = Cifrado::Config.instance.cache_dir
|
162
|
+
encrypted_output = cs.encrypt file,
|
163
|
+
File.join(cache_dir, File.basename(file))
|
164
|
+
else
|
165
|
+
file
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# FIXME: needs refactoring
|
170
|
+
def split_and_upload(client, container, object)
|
171
|
+
fbasename = File.basename(object)
|
172
|
+
|
173
|
+
# Encrypts the file if required
|
174
|
+
out = encrypt_if_required(object)
|
175
|
+
|
176
|
+
splitter = FileSplitter.new out, options[:segments]
|
177
|
+
|
178
|
+
if options[:encrypt]
|
179
|
+
target_manifest = File.basename(out)
|
180
|
+
else
|
181
|
+
target_manifest = (options[:strip_path] ? \
|
182
|
+
File.basename(object) : clean_object_name(object))
|
183
|
+
end
|
184
|
+
|
185
|
+
Log.info "Segmenting file, #{options[:segments]} segments..."
|
186
|
+
Log.info "Uploading #{fbasename} segments"
|
187
|
+
|
188
|
+
segments_uploaded = []
|
189
|
+
splitter.split do |n, segment|
|
190
|
+
segment_size = File.size segment
|
191
|
+
hsegment_size = humanize_bytes segment_size
|
192
|
+
Log.info "Uploading segment #{n}/#{options[:segments]} (#{hsegment_size})"
|
193
|
+
|
194
|
+
segment_number = "%08d" % n
|
195
|
+
if options[:encrypt]
|
196
|
+
suffix = splitter.chunk_suffix + segment_number
|
197
|
+
obj_path = File.basename(out) + suffix
|
198
|
+
Log.debug "Encrypted object path: #{obj_path}"
|
199
|
+
encrypted_name = encrypt_filename object + suffix,
|
200
|
+
secure_password
|
201
|
+
headers = {
|
202
|
+
'X-Object-Meta-Encrypted-Name' => encrypted_name
|
203
|
+
}
|
204
|
+
else
|
205
|
+
obj_path = object + splitter.chunk_suffix + segment_number
|
206
|
+
Log.debug "Unencrypted object path #{obj_path}"
|
207
|
+
if options[:strip_path]
|
208
|
+
obj_path = File.basename(obj_path)
|
209
|
+
Log.debug "Stripping path from object: #{obj_path}"
|
210
|
+
end
|
211
|
+
Log.debug "Uploading segment #{obj_path} (#{segment_size} bytes)..."
|
212
|
+
headers = {}
|
213
|
+
end
|
214
|
+
|
215
|
+
case client.match(segment, container + "_segments", obj_path)
|
216
|
+
when 1
|
217
|
+
Log.warn 'Segment already uploaded, skipping.'
|
218
|
+
File.delete segment
|
219
|
+
next
|
220
|
+
when 2
|
221
|
+
Log.warn 'Segment already uploaded but looks different. Updating.'
|
222
|
+
end
|
223
|
+
|
224
|
+
pb = Progressbar.new options[:segments],
|
225
|
+
n,
|
226
|
+
:style => options[:progressbar]
|
227
|
+
|
228
|
+
client.upload container + "_segments",
|
229
|
+
segment,
|
230
|
+
:headers => headers,
|
231
|
+
:object_path => obj_path,
|
232
|
+
:progress_callback => pb.block,
|
233
|
+
:bwlimit => bwlimit
|
234
|
+
|
235
|
+
File.delete segment
|
236
|
+
segments_uploaded << obj_path
|
237
|
+
end
|
238
|
+
|
239
|
+
if options[:encrypt]
|
240
|
+
Log.debug "Deleting temporal encrypted file #{out}"
|
241
|
+
File.delete out
|
242
|
+
end
|
243
|
+
|
244
|
+
if segments_uploaded.size == 0
|
245
|
+
Log.warn 'All the segments have been previously uploaded.'
|
246
|
+
Log.warn 'Skipping manifest creation.'
|
247
|
+
return segments_uploaded
|
248
|
+
end
|
249
|
+
|
250
|
+
# We need this for segmented uploads
|
251
|
+
Log.debug "Adding manifest path #{target_manifest}"
|
252
|
+
xom = "#{Fog::OpenStack.escape(container + '_segments')}/" +
|
253
|
+
"#{Fog::OpenStack.escape(target_manifest)}"
|
254
|
+
headers = { 'X-Object-Manifest' => xom }
|
255
|
+
if options[:encrypt]
|
256
|
+
encrypted_name = encrypt_filename object, secure_password
|
257
|
+
headers['X-Object-Meta-Encrypted-Name'] = encrypted_name
|
258
|
+
end
|
259
|
+
client.create_directory container
|
260
|
+
client.service.put_object_manifest container,
|
261
|
+
target_manifest,
|
262
|
+
headers
|
263
|
+
segments_uploaded.insert 0, target_manifest
|
264
|
+
|
265
|
+
segments_uploaded
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
269
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Cifrado
|
4
|
+
class Config
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
unless File.directory?(cache_dir)
|
9
|
+
Log.debug "Creating cache dir: #{cache_dir}"
|
10
|
+
FileUtils.mkdir_p(cache_dir)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def cache_dir
|
15
|
+
File.join(ENV['HOME'], '.cache/cifrado')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Adds urlsafe_encode64 and urlsafe_decode64 for Ruby 1.8.
|
2
|
+
if RUBY_VERSION < '1.9'
|
3
|
+
module Base64
|
4
|
+
module_function
|
5
|
+
|
6
|
+
def urlsafe_encode64(str)
|
7
|
+
[str].pack("m0").tr("\n",'').tr("+/", "-_")
|
8
|
+
end
|
9
|
+
|
10
|
+
def urlsafe_decode64(str)
|
11
|
+
str.tr("-_", "+/").unpack("m0").first
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,218 @@
|
|
1
|
+
require 'digest/sha2'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
module Cifrado
|
5
|
+
class CryptoServices
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@options = options
|
9
|
+
@gpg_binary = @options[:gpg_binary] || '/usr/bin/gpg'
|
10
|
+
@gpg_extra_args = @options[:gpg_extra_args] || []
|
11
|
+
@gpg_extra_args = @gpg_extra_args.concat %w(--batch --yes)
|
12
|
+
@encrypt_name = @options[:encrypt_name] || false
|
13
|
+
end
|
14
|
+
|
15
|
+
def encrypt(file, output)
|
16
|
+
unless file and File.exist?(file)
|
17
|
+
raise ArgumentError.new "Invalid file #{file}"
|
18
|
+
end
|
19
|
+
|
20
|
+
if output.nil?
|
21
|
+
raise ArgumentError.new "Invalid output file path"
|
22
|
+
end
|
23
|
+
|
24
|
+
# so we can use --use-embedded-filename to recover the original
|
25
|
+
# filename
|
26
|
+
Log.debug "Setting GPG filename #{file} (Base64 URL encoded)"
|
27
|
+
clean_path = Pathname.new(file).cleanpath.to_s
|
28
|
+
@gpg_extra_args << "--set-filename '#{Base64.urlsafe_encode64(clean_path)}'"
|
29
|
+
|
30
|
+
check_args
|
31
|
+
raise ArgumentError.new("#{@gpg_binary} not found") unless File.exist?(@gpg_binary)
|
32
|
+
|
33
|
+
Log.debug "Encrypting file #{file}..."
|
34
|
+
if @encrypt_name and output != '-'
|
35
|
+
Log.debug "Scrambling file name #{file}..."
|
36
|
+
dir = File.dirname(output)
|
37
|
+
#output = File.join dir, (Digest::SHA2.new << (output + SecureRandom.hex)).to_s
|
38
|
+
output = File.join dir, (Digest::SHA2.new << file).to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
if output != '-'
|
42
|
+
@gpg_extra_args << ["--output #{Shellwords.escape(output)}"]
|
43
|
+
end
|
44
|
+
|
45
|
+
if @options[:type] == :asymmetric
|
46
|
+
asymmetric file, output
|
47
|
+
else @options[:type] == :symmetric
|
48
|
+
symmetric file, output
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.encrypted?(file)
|
53
|
+
output = `/usr/bin/gpg --yes --batch --no-use-agent --list-packets #{file} 2>&1`
|
54
|
+
Log.debug output
|
55
|
+
if output.match(/AES256 encrypted|encrypted with\s.*\skey,\sID\s.*created/m).nil?
|
56
|
+
return false
|
57
|
+
end
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def decrypt(file, output)
|
62
|
+
unless file and File.exist?(file)
|
63
|
+
raise ArgumentError.new "Invalid file #{file}"
|
64
|
+
end
|
65
|
+
|
66
|
+
if output.nil?
|
67
|
+
raise ArgumentError.new "Invalid output file path"
|
68
|
+
end
|
69
|
+
|
70
|
+
raise ArgumentError.new("#{@gpg_binary} not found") unless File.exist?(@gpg_binary)
|
71
|
+
|
72
|
+
Log.debug "Decrypting file #{file}..."
|
73
|
+
|
74
|
+
if output != '-'
|
75
|
+
@gpg_extra_args << "--output #{Shellwords.escape(output)}"
|
76
|
+
end
|
77
|
+
|
78
|
+
if @options[:passphrase]
|
79
|
+
@gpg_extra_args << "--no-use-agent --passphrase #{@options[:passphrase]}"
|
80
|
+
end
|
81
|
+
|
82
|
+
cmd = "#{@gpg_binary} #{@gpg_extra_args.join(' ')} --decrypt #{Shellwords.escape(file)}"
|
83
|
+
Log.debug "Decrypting with: #{cmd}"
|
84
|
+
out = `#{cmd} 2>&1`
|
85
|
+
|
86
|
+
if $? != 0
|
87
|
+
raise "Failed to decrypt file #{file}\n#{out}"
|
88
|
+
else
|
89
|
+
if @options[:delete_source]
|
90
|
+
File.delete file
|
91
|
+
Log.debug "Deleting encrypted file #{file}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
Log.debug out
|
96
|
+
output
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def check_args
|
102
|
+
if @options[:type] == :asymmetric
|
103
|
+
unless @options[:recipient]
|
104
|
+
raise ArgumentError.new('Missing encryption recipient')
|
105
|
+
end
|
106
|
+
elsif @options[:type] == :symmetric
|
107
|
+
unless @options[:passphrase]
|
108
|
+
raise ArgumentError.new('Missing encryption passphrase')
|
109
|
+
end
|
110
|
+
else
|
111
|
+
raise ArgumentError.new "Unknown encryption type #{@options[:type]}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def symmetric(file, output)
|
116
|
+
pfile = "/tmp/#{SecureRandom.hex}"
|
117
|
+
File.open(pfile, 'w') { |f| f.puts @options[:passphrase]; f.sync }
|
118
|
+
cmd = "#{@gpg_binary} #{@gpg_extra_args.join(' ')} --no-use-agent --passphrase-file #{pfile} --cipher-algo aes256 --symmetric #{Shellwords.escape(file)}"
|
119
|
+
#File.delete(pfile)
|
120
|
+
Log.debug "Encrypting with: #{cmd}"
|
121
|
+
out = `#{cmd} 2>&1`
|
122
|
+
|
123
|
+
if $? != 0
|
124
|
+
raise "Failed to encrypt file #{file}\n#{out}"
|
125
|
+
else
|
126
|
+
if @options[:delete_source]
|
127
|
+
File.delete file
|
128
|
+
Log.debug "Deleting unencrypted chunk #{file}"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
Log.debug out
|
133
|
+
output
|
134
|
+
end
|
135
|
+
|
136
|
+
def asymmetric(file, output)
|
137
|
+
recipient = @options[:recipient]
|
138
|
+
cmd = "#{@gpg_binary} #{@gpg_extra_args.join(' ')} --no-encrypt-to --no-default-recipient --recipient '#{recipient}' --encrypt #{Shellwords.escape(file)}"
|
139
|
+
Log.debug "Encrypting with: #{cmd}"
|
140
|
+
out = `#{cmd} 2>&1`
|
141
|
+
|
142
|
+
if $? != 0
|
143
|
+
raise "Failed to encrypt file #{file}\n#{out}"
|
144
|
+
else
|
145
|
+
if @options[:delete_source]
|
146
|
+
File.delete file
|
147
|
+
Log.debug "Deleting unencrypted chunk #{file}"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
Log.debug out
|
152
|
+
output
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
#
|
158
|
+
# Shamelessly stolen from Gibberish, from Mark Percival
|
159
|
+
# so I don't have to depend on yet another gem.
|
160
|
+
#
|
161
|
+
# See: https://github.com/mdp/gibberish
|
162
|
+
#
|
163
|
+
# Added a few small modifications:
|
164
|
+
#
|
165
|
+
# * Use Base64 urlsafe_encode/decode
|
166
|
+
#
|
167
|
+
class CryptoEngineAES
|
168
|
+
|
169
|
+
attr_reader :password, :size, :cipher
|
170
|
+
|
171
|
+
# Initialize with the password
|
172
|
+
#
|
173
|
+
# @param [String] password
|
174
|
+
# @param [Integer] size
|
175
|
+
def initialize(password, size=256)
|
176
|
+
@password = password
|
177
|
+
@size = size
|
178
|
+
@cipher = OpenSSL::Cipher::Cipher.new("aes-#{size}-cbc")
|
179
|
+
end
|
180
|
+
|
181
|
+
def encrypt(data, opts={})
|
182
|
+
salt = generate_salt(opts[:salt])
|
183
|
+
setup_cipher(:encrypt, salt)
|
184
|
+
e = cipher.update(data) + cipher.final
|
185
|
+
e = "Salted__#{salt}#{e}" #OpenSSL compatible
|
186
|
+
opts[:binary] ? e : Base64.urlsafe_encode64(e)
|
187
|
+
end
|
188
|
+
alias :enc :encrypt
|
189
|
+
alias :e :encrypt
|
190
|
+
|
191
|
+
def decrypt(data, opts={})
|
192
|
+
data = Base64.urlsafe_decode64(data) unless opts[:binary]
|
193
|
+
salt = data[8..15]
|
194
|
+
data = data[16..-1]
|
195
|
+
setup_cipher(:decrypt, salt)
|
196
|
+
cipher.update(data) + cipher.final
|
197
|
+
end
|
198
|
+
alias :dec :decrypt
|
199
|
+
alias :d :decrypt
|
200
|
+
|
201
|
+
private
|
202
|
+
|
203
|
+
def generate_salt(supplied_salt)
|
204
|
+
if supplied_salt
|
205
|
+
return supplied_salt.to_s[0,8].ljust(8,'.')
|
206
|
+
end
|
207
|
+
s = ''
|
208
|
+
8.times {s << rand(255).chr}
|
209
|
+
s
|
210
|
+
end
|
211
|
+
|
212
|
+
def setup_cipher(method, salt)
|
213
|
+
cipher.send(method)
|
214
|
+
cipher.pkcs5_keyivgen(password, salt, 1)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|