Compare commits

...

42 Commits

Author SHA1 Message Date
erwanlr
cdc1dab4a6 Bumps version 2019-02-11 11:48:49 +00:00
erwanlr
431739ab19 Updates Rubocop dep 2019-02-11 10:44:29 +00:00
erwanlr
1780399050 Fixes #1277 2019-02-10 15:32:30 +00:00
erwanlr
eb75d38716 Fixes #1284 2019-02-10 13:47:19 +00:00
erwanlr
06f82d78f4 Ref #1285 - Adds comment about the pagination 2019-02-10 10:49:03 +00:00
erwanlr
dee4da1c0e Fixes #1285 2019-02-10 10:45:54 +00:00
erwanlr
e341ec7c60 Adds DFs 2019-02-10 09:44:17 +00:00
Erwan
9146609e4a Update Readme, Fixes #1286 2019-02-03 20:46:03 +01:00
erwanlr
f90615ca41 Adds DF 2019-02-03 07:08:05 +00:00
erwanlr
8a2a6a05ff Adds DFs 2019-01-27 10:54:13 +00:00
Erwan
5a787f8ed5 Adds a note about bug in Ruby 2.5.x, Ref #1283 2019-01-25 20:14:14 +00:00
erwanlr
a904053002 Adds DFs 2019-01-20 17:04:32 +00:00
Erwan
70ecd30dcc Merge pull request #1276 from wpscanteam/dependabot/bundler/rubocop-tw-0.63.0
Update rubocop requirement from ~> 0.62.0 to ~> 0.63.0
2019-01-17 09:32:24 +00:00
dependabot[bot]
b0976d7e47 Update rubocop requirement from ~> 0.62.0 to ~> 0.63.0
Updates the requirements on [rubocop](https://github.com/rubocop-hq/rubocop) to permit the latest version.
- [Release notes](https://github.com/rubocop-hq/rubocop/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop/commits/v0.63.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-17 05:54:18 +00:00
erwanlr
bb5e55016c Adds DFs 2019-01-13 16:56:13 +00:00
erwanlr
abdf285c69 Bumps version 2019-01-11 11:53:11 +00:00
erwanlr
fd4da23d4f Creates simplecov exetrnal config 2019-01-11 11:13:49 +00:00
erwanlr
bb8f58c83b Updates deps 2019-01-11 11:12:34 +00:00
erwanlr
077da6ae86 Moves require spec_helper to config file 2019-01-11 11:11:56 +00:00
erwanlr
d5222d7e9a Adds DFs 2019-01-07 14:58:03 +00:00
erwanlr
01702c127b Tries to fix Travis again 2019-01-07 11:47:58 +00:00
Erwan
87902cbfb4 Tries to fix Travis builds 2019-01-07 10:54:05 +00:00
ethicalhack3r
fcaa393ffe Update license 2019-01-07 10:54:24 +01:00
ethicalhack3r
18bac6e792 Update to Ruby 2.6.0 2019-01-07 10:16:32 +01:00
erwanlr
9a21efebe3 Updates DFs 2018-12-28 22:50:05 +00:00
erwanlr
357182ef17 Adds DFs 2018-12-28 22:43:41 +00:00
erwanlr
5fad540a4c Bumps version 2018-12-28 13:35:01 +00:00
erwanlr
c1fc153420 Updates Deps, ref #1266 2018-12-28 11:17:37 +00:00
erwanlr
73a1974f85 Bumps version 2018-12-13 22:16:45 +00:00
erwanlr
dec73c21b6 Fixes #1264 2018-12-13 22:11:37 +00:00
erwanlr
46a00cc864 Adds DFs 2018-12-07 14:59:03 +00:00
erwanlr
62455be165 Deletes useless specs 2018-12-06 22:54:17 +00:00
erwanlr
17ef5ef918 Reverts spec changes 2018-12-06 22:52:10 +00:00
erwanlr
922b6fffd0 Fixes specs 2018-12-06 21:46:13 +00:00
erwanlr
b47bf006d0 Removes useless spec 2018-12-06 21:44:54 +00:00
erwanlr
d60269f4bc Adds DFs 2018-12-06 21:41:00 +00:00
erwanlr
1ce057a78e Adds DFs 2018-12-06 15:54:15 +00:00
erwanlr
a0fe04b990 Fixes #1260 2018-12-06 02:51:23 +00:00
erwanlr
31c9172e19 Removes false positive DFs 2018-12-03 15:37:09 +00:00
erwanlr
7f23cbef71 Adds DFs 2018-12-03 15:08:56 +00:00
Ryan Dewhurst
4884defaed Add some references to interesting findings 2018-11-22 15:04:43 +01:00
erwanlr
3039218c40 Adds DFs 2018-11-18 11:45:58 +00:00
243 changed files with 53778 additions and 468 deletions

1
.rspec
View File

@@ -1,2 +1,3 @@
--color --color
--fail-fast --fail-fast
--require spec_helper

View File

@@ -1 +1 @@
2.5.3 2.6.0

4
.simplecov Normal file
View File

@@ -0,0 +1,4 @@
SimpleCov.start do
add_filter '/spec/'
add_filter 'helper'
end

View File

@@ -20,10 +20,11 @@ rvm:
- 2.5.1 - 2.5.1
- 2.5.2 - 2.5.2
- 2.5.3 - 2.5.3
- 2.6.0
- ruby-head - ruby-head
before_install: before_install:
- "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc" - "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
- "gem update --system" - gem update --system
matrix: matrix:
allow_failures: allow_failures:
- rvm: ruby-head - rvm: ruby-head

View File

@@ -1,6 +1,6 @@
WPScan Public Source License WPScan Public Source License
The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2018 WPScan Team. The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2019 WPScan Team.
Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below. Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below.
@@ -8,7 +8,7 @@ Cases that include commercialization of WPScan require a commercial, non-free li
1.1 “License” means this document. 1.1 “License” means this document.
1.2 “Contributor” means each individual or legal entity that creates, contributes to the creation of, or owns WPScan. 1.2 “Contributor” means each individual or legal entity that creates, contributes to the creation of, or owns WPScan.
1.3 “WPScan Team” means WPScans core developers, an updated list of whom can be found within the CREDITS file. 1.3 “WPScan Team” means WPScans core developers.
2. Commercialization 2. Commercialization
@@ -29,8 +29,6 @@ Example cases which do not require a commercial license, and thus fall under the
If you need to purchase a commercial license or are unsure whether you need to purchase a commercial license contact us - team@wpscan.org. If you need to purchase a commercial license or are unsure whether you need to purchase a commercial license contact us - team@wpscan.org.
We may grant commercial licenses at no monetary cost at our own discretion if the commercial usage is deemed by the WPScan Team to significantly benefit WPScan.
Free-use Terms and Conditions; Free-use Terms and Conditions;
3. Redistribution 3. Redistribution

View File

@@ -9,17 +9,22 @@
## Prerequisites: ## Prerequisites:
- (Optional but highly recommended: [RVM](https://rvm.io/rvm/install))
- Ruby >= 2.3 - Recommended: latest - Ruby >= 2.3 - Recommended: latest
- Curl >= 7.21 - Recommended: latest - FYI the 7.29 has a segfault - Ruby 2.5.0 to 2.5.3 can cause an 'undefined symbol: rmpd_util_str_to_d' error in some systems, see [#1283](https://github.com/wpscanteam/wpscan/issues/1283)
- Curl >= 7.21 - Recommended: latest
- The 7.29 has a segfault
- RubyGems - Recommended: latest - RubyGems - Recommended: latest
### From RubyGems: ### From RubyGems (Recommended):
``` ```
gem install wpscan gem install wpscan
``` ```
### From sources: On MacOSX, if a ```Gem::FilePermissionError``` is raised due to the Apple's System Integrity Protection (SIP), either install RVM and install wpscan again, or run ```sudo gem install -n /usr/local/bin wpscan``` (see [#1286](https://github.com/wpscanteam/wpscan/issues/1286))
### From sources (NOT Recommended):
Prerequisites: Git Prerequisites: Git
@@ -31,6 +36,12 @@ cd wpscan/
bundle install && rake install bundle install && rake install
``` ```
# Updating
You can update the local database by using ```wpscan --update```
Updating WPScan itself is either done via ```gem update wpscan``` or the packages manager (this is quite important for distributions such as in Kali Linux: ```apt-get update && apt-get upgrade```) depending how WPScan was (pre)installed
# Docker # Docker
Pull the repo with ```docker pull wpscanteam/wpscan``` Pull the repo with ```docker pull wpscanteam/wpscan```
@@ -105,7 +116,7 @@ wpscan --url https://target.tld/ --enumerate u1-100
## WPScan Public Source License ## WPScan Public Source License
The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2018 WPScan Team. The WPScan software (henceforth referred to simply as "WPScan") is dual-licensed - Copyright 2011-2019 WPScan Team.
Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below. Cases that include commercialization of WPScan require a commercial, non-free license. Otherwise, WPScan can be used without charge under the terms set out below.
@@ -115,7 +126,7 @@ Cases that include commercialization of WPScan require a commercial, non-free li
1.2 "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns WPScan. 1.2 "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns WPScan.
1.3 "WPScan Team" means WPScans core developers, an updated list of whom can be found within the CREDITS file. 1.3 "WPScan Team" means WPScans core developers.
### 2. Commercialization ### 2. Commercialization
@@ -136,8 +147,6 @@ Example cases which do not require a commercial license, and thus fall under the
If you need to purchase a commercial license or are unsure whether you need to purchase a commercial license contact us - team@wpscan.org. If you need to purchase a commercial license or are unsure whether you need to purchase a commercial license contact us - team@wpscan.org.
We may grant commercial licenses at no monetary cost at our own discretion if the commercial usage is deemed by the WPScan Team to significantly benefit WPScan.
Free-use Terms and Conditions; Free-use Terms and Conditions;
### 3. Redistribution ### 3. Redistribution

View File

@@ -71,7 +71,7 @@ module WPScan
exit(WPScan::ExitCode::VULNERABLE) exit(WPScan::ExitCode::VULNERABLE)
end end
raise NotWordPressError unless target.wordpress? || parsed_options[:force] raise NotWordPressError unless target.wordpress?(parsed_options[:detection_mode]) || parsed_options[:force]
end end
# Loads the related server module in the target # Loads the related server module in the target

View File

@@ -3,9 +3,10 @@ module WPScan
# Enumeration Methods # Enumeration Methods
class Enumeration < CMSScanner::Controller::Base class Enumeration < CMSScanner::Controller::Base
# @param [ String ] type (plugins or themes) # @param [ String ] type (plugins or themes)
# @param [ Symbol ] detection_mode
# #
# @return [ String ] The related enumration message depending on the parsed_options and type supplied # @return [ String ] The related enumration message depending on the parsed_options and type supplied
def enum_message(type) def enum_message(type, detection_mode)
return unless %w[plugins themes].include?(type) return unless %w[plugins themes].include?(type)
details = if parsed_options[:enumerate][:"vulnerable_#{type}"] details = if parsed_options[:enumerate][:"vulnerable_#{type}"]
@@ -16,7 +17,20 @@ module WPScan
'Most Popular' 'Most Popular'
end end
"Enumerating #{details} #{type.capitalize}" "Enumerating #{details} #{type.capitalize} #{enum_detection_message(detection_mode)}"
end
# @param [ Symbol ] detection_mode
#
# @return [ String ]
def enum_detection_message(detection_mode)
detection_method = if detection_mode == :mixed
'Passive and Aggressive'
else
detection_mode.to_s.capitalize
end
"(via #{detection_method} Methods)"
end end
# @param [ String ] type (plugins, themes etc) # @param [ String ] type (plugins, themes etc)
@@ -49,12 +63,15 @@ module WPScan
sort: true sort: true
) )
output('@info', msg: enum_message('plugins')) if user_interaction? output('@info', msg: enum_message('plugins', opts[:mode])) if user_interaction?
# Enumerate the plugins & find their versions to avoid doing that when #version # Enumerate the plugins & find their versions to avoid doing that when #version
# is called in the view # is called in the view
plugins = target.plugins(opts) plugins = target.plugins(opts)
output('@info', msg: 'Checking Plugin Versions') if user_interaction? && !plugins.empty? if user_interaction? && !plugins.empty?
output('@info',
msg: "Checking Plugin Versions #{enum_detection_message(opts[:version_detection][:mode])}")
end
plugins.each(&:version) plugins.each(&:version)
@@ -92,12 +109,15 @@ module WPScan
sort: true sort: true
) )
output('@info', msg: enum_message('themes')) if user_interaction? output('@info', msg: enum_message('themes', opts[:mode])) if user_interaction?
# Enumerate the themes & find their versions to avoid doing that when #version # Enumerate the themes & find their versions to avoid doing that when #version
# is called in the view # is called in the view
themes = target.themes(opts) themes = target.themes(opts)
output('@info', msg: 'Checking Theme Versions') if user_interaction? && !themes.empty? if user_interaction? && !themes.empty?
output('@info',
msg: "Checking Theme Versions #{enum_detection_message(opts[:version_detection][:mode])}")
end
themes.each(&:version) themes.each(&:version)
@@ -125,21 +145,21 @@ module WPScan
def enum_timthumbs def enum_timthumbs
opts = default_opts('timthumbs').merge(list: parsed_options[:timthumbs_list]) opts = default_opts('timthumbs').merge(list: parsed_options[:timthumbs_list])
output('@info', msg: 'Enumerating Timthumbs') if user_interaction? output('@info', msg: "Enumerating Timthumbs #{enum_detection_message(opts[:mode])}") if user_interaction?
output('timthumbs', timthumbs: target.timthumbs(opts)) output('timthumbs', timthumbs: target.timthumbs(opts))
end end
def enum_config_backups def enum_config_backups
opts = default_opts('config_backups').merge(list: parsed_options[:config_backups_list]) opts = default_opts('config_backups').merge(list: parsed_options[:config_backups_list])
output('@info', msg: 'Enumerating Config Backups') if user_interaction? output('@info', msg: "Enumerating Config Backups #{enum_detection_message(opts[:mode])}") if user_interaction?
output('config_backups', config_backups: target.config_backups(opts)) output('config_backups', config_backups: target.config_backups(opts))
end end
def enum_db_exports def enum_db_exports
opts = default_opts('db_exports').merge(list: parsed_options[:db_exports_list]) opts = default_opts('db_exports').merge(list: parsed_options[:db_exports_list])
output('@info', msg: 'Enumerating DB Exports') if user_interaction? output('@info', msg: "Enumerating DB Exports #{enum_detection_message(opts[:mode])}") if user_interaction?
output('db_exports', db_exports: target.db_exports(opts)) output('db_exports', db_exports: target.db_exports(opts))
end end
@@ -147,7 +167,9 @@ module WPScan
opts = default_opts('medias').merge(range: parsed_options[:enumerate][:medias]) opts = default_opts('medias').merge(range: parsed_options[:enumerate][:medias])
if user_interaction? if user_interaction?
output('@info', msg: 'Enumerating Medias (Permalink setting must be set to "Plain" for those to be detected)') output('@info',
msg: "Enumerating Medias #{enum_detection_message(opts[:mode])} "\
'(Permalink setting must be set to "Plain" for those to be detected)')
end end
output('medias', medias: target.medias(opts)) output('medias', medias: target.medias(opts))
@@ -166,7 +188,7 @@ module WPScan
list: parsed_options[:users_list] list: parsed_options[:users_list]
) )
output('@info', msg: 'Enumerating Users') if user_interaction? output('@info', msg: "Enumerating Users #{enum_detection_message(opts[:mode])}") if user_interaction?
output('users', users: target.users(opts)) output('users', users: target.users(opts))
end end

View File

@@ -11,7 +11,8 @@ module WPScan
WPScan::DebugLog.new( WPScan::DebugLog.new(
target.url(path), target.url(path),
confidence: 100, found_by: DIRECT_ACCESS confidence: 100, found_by: DIRECT_ACCESS,
references: { url: 'https://codex.wordpress.org/Debugging_in_WordPress' }
) )
end end
end end

View File

@@ -14,7 +14,8 @@ module WPScan
target.url(path), target.url(path),
confidence: 100, confidence: 100,
found_by: DIRECT_ACCESS, found_by: DIRECT_ACCESS,
interesting_entries: fpd_entries interesting_entries: fpd_entries,
references: { url: 'https://www.owasp.org/index.php/Full_Path_Disclosure' }
) )
end end
end end

View File

@@ -4,20 +4,29 @@ module WPScan
# WP JSON API # WP JSON API
# #
# Since 4.7 - Need more investigation as it seems WP 4.7.1 reduces the exposure, see https://github.com/wpscanteam/wpscan/issues/1038) # Since 4.7 - Need more investigation as it seems WP 4.7.1 reduces the exposure, see https://github.com/wpscanteam/wpscan/issues/1038)
# For the pagination, see https://github.com/wpscanteam/wpscan/issues/1285
# #
class WpJsonApi < CMSScanner::Finders::Finder class WpJsonApi < CMSScanner::Finders::Finder
MAX_PER_PAGE = 100 # See https://developer.wordpress.org/rest-api/using-the-rest-api/pagination/
# @param [ Hash ] opts # @param [ Hash ] opts
# #
# @return [ Array<User> ] # @return [ Array<User> ]
def aggressive(_opts = {}) def aggressive(_opts = {})
found = [] found = []
current_page = 0
JSON.parse(Browser.get(api_url).body)&.each do |user| loop do
found << CMSScanner::User.new(user['slug'], current_page += 1
id: user['id'],
found_by: found_by, res = Typhoeus.get(api_url, params: { per_page: MAX_PER_PAGE, page: current_page })
confidence: 100,
interesting_entries: [api_url]) total_pages ||= res.headers['X-WP-TotalPages'].to_i
users_in_page = users_from_response(res)
found += users_in_page
break if current_page >= total_pages || users_in_page.empty?
end end
found found
@@ -25,6 +34,23 @@ module WPScan
found found
end end
# @param [ Typhoeus::Response ] response
#
# @return [ Array<User> ] The users from the response
def users_from_response(response)
found = []
JSON.parse(response.body)&.each do |user|
found << CMSScanner::User.new(user['slug'],
id: user['id'],
found_by: found_by,
confidence: 100,
interesting_entries: [response.effective_url])
end
found
end
# @return [ String ] The URL of the API listing the Users # @return [ String ] The URL of the API listing the Users
def api_url def api_url
@api_url ||= target.url('wp-json/wp/v2/users/') @api_url ||= target.url('wp-json/wp/v2/users/')

View File

@@ -53,12 +53,12 @@ module WPScan
# @return [ String ] # @return [ String ]
def release_date def release_date
@release_date ||= db_data['release_date'] @release_date ||= db_data['release_date'] || 'Unknown'
end end
# @return [ String ] # @return [ String ]
def status def status
@status ||= db_data['status'] @status ||= db_data['status'] || 'Unknown'
end end
end end
end end

View File

@@ -18,10 +18,10 @@ module WPScan
alias registration_enabled? registration_enabled alias registration_enabled? registration_enabled
alias mu_plugins? mu_plugins alias mu_plugins? mu_plugins
# @param [ Symbol ] detection_mode
#
# @return [ Boolean ] # @return [ Boolean ]
def wordpress? def wordpress?(detection_mode)
# res = Browser.get(url)
in_scope_urls(homepage_res) do |url| in_scope_urls(homepage_res) do |url|
return true if Addressable::URI.parse(url).path.match(WORDPRESS_PATTERN) return true if Addressable::URI.parse(url).path.match(WORDPRESS_PATTERN)
end end
@@ -32,6 +32,14 @@ module WPScan
return true unless comments_from_page(/wordpress/i, homepage_res).empty? return true unless comments_from_page(/wordpress/i, homepage_res).empty?
if %i[mixed aggressive].include?(detection_mode)
%w[wp-admin/install.php wp-login.php].each do |path|
in_scope_urls(Browser.get_and_follow_location(url(path))).each do |url|
return true if Addressable::URI.parse(url).path.match(WORDPRESS_PATTERN)
end
end
end
false false
end end

View File

@@ -1,4 +1,4 @@
# Version # Version
module WPScan module WPScan
VERSION = '3.4.0'.freeze VERSION = '3.4.4'.freeze
end end

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Controller::Aliases do describe WPScan::Controller::Aliases do
subject(:controller) { described_class.new } subject(:controller) { described_class.new }
let(:target_url) { 'http://ex.lo/' } let(:target_url) { 'http://ex.lo/' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Controller::Core do describe WPScan::Controller::Core do
subject(:core) { described_class.new } subject(:core) { described_class.new }
let(:target_url) { 'http://ex.lo/' } let(:target_url) { 'http://ex.lo/' }
@@ -167,7 +165,7 @@ describe WPScan::Controller::Core do
before do before do
expect(core).to receive(:load_server_module) expect(core).to receive(:load_server_module)
expect(core.target).to receive(:wordpress?).and_return(true) expect(core.target).to receive(:wordpress?).with(:mixed).and_return(true)
end end
it 'calls the formatter when started and finished to update the db' do it 'calls the formatter when started and finished to update the db' do
@@ -210,7 +208,7 @@ describe WPScan::Controller::Core do
context 'when wordpress' do context 'when wordpress' do
it 'does not raise an error' do it 'does not raise an error' do
expect(core.target).to receive(:wordpress?).and_return(true) expect(core.target).to receive(:wordpress?).with(:mixed).and_return(true)
expect { core.before_scan }.to_not raise_error expect { core.before_scan }.to_not raise_error
end end
@@ -218,7 +216,7 @@ describe WPScan::Controller::Core do
context 'when not wordpress' do context 'when not wordpress' do
it 'raises an error' do it 'raises an error' do
expect(core.target).to receive(:wordpress?).and_return(false) expect(core.target).to receive(:wordpress?).with(:mixed).and_return(false)
expect { core.before_scan }.to raise_error(WPScan::NotWordPressError) expect { core.before_scan }.to raise_error(WPScan::NotWordPressError)
end end
@@ -239,7 +237,7 @@ describe WPScan::Controller::Core do
context 'when wordpress' do context 'when wordpress' do
before do before do
expect(core).to receive(:load_server_module) expect(core).to receive(:load_server_module)
expect(core.target).to receive(:wordpress?).and_return(true) expect(core.target).to receive(:wordpress?).with(:mixed).and_return(true)
end end
it 'does not raise any error' do it 'does not raise any error' do
@@ -250,7 +248,7 @@ describe WPScan::Controller::Core do
context 'when not wordpress' do context 'when not wordpress' do
before do before do
expect(core).to receive(:load_server_module) expect(core).to receive(:load_server_module)
expect(core.target).to receive(:wordpress?).and_return(false) expect(core.target).to receive(:wordpress?).with(:mixed).and_return(false)
end end
context 'when no --force' do context 'when no --force' do

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Controller::CustomDirectories do describe WPScan::Controller::CustomDirectories do
subject(:controller) { described_class.new } subject(:controller) { described_class.new }
let(:target_url) { 'http://ex.lo/' } let(:target_url) { 'http://ex.lo/' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Controller::Enumeration do describe WPScan::Controller::Enumeration do
subject(:controller) { described_class.new } subject(:controller) { described_class.new }
let(:target_url) { 'http://wp.lab/' } let(:target_url) { 'http://wp.lab/' }
@@ -16,10 +14,11 @@ describe WPScan::Controller::Enumeration do
end end
describe '#enum_message' do describe '#enum_message' do
after { expect(controller.enum_message(type)).to eql @expected } after { expect(controller.enum_message(type, detection_mode)).to eql @expected }
context 'when type argument is incorrect' do context 'when type argument is incorrect' do
let(:type) { 'spec' } let(:type) { 'spec' }
let(:detection_mode) { :mixed }
it 'returns nil' do it 'returns nil' do
@expected = nil @expected = nil
@@ -29,28 +28,31 @@ describe WPScan::Controller::Enumeration do
%w[plugins themes].each do |t| %w[plugins themes].each do |t|
context "type = #{t}" do context "type = #{t}" do
let(:type) { t } let(:type) { t }
let(:detection_mode) { :mixed }
context 'when vulnerable' do context 'when vulnerable' do
let(:cli_args) { "#{super()} -e v#{type[0]}" } let(:cli_args) { "#{super()} -e v#{type[0]}" }
it 'returns the expected string' do it 'returns the expected string' do
@expected = "Enumerating Vulnerable #{type.capitalize}" @expected = "Enumerating Vulnerable #{type.capitalize} (via Passive and Aggressive Methods)"
end end
end end
context 'when all' do context 'when all' do
let(:cli_args) { "#{super()} -e a#{type[0]}" } let(:cli_args) { "#{super()} -e a#{type[0]}" }
let(:detection_mode) { :passive }
it 'returns the expected string' do it 'returns the expected string' do
@expected = "Enumerating All #{type.capitalize}" @expected = "Enumerating All #{type.capitalize} (via Passive Methods)"
end end
end end
context 'when most popular' do context 'when most popular' do
let(:cli_args) { "#{super()} -e #{type[0]}" } let(:cli_args) { "#{super()} -e #{type[0]}" }
let(:detection_mode) { :aggressive }
it 'returns the expected string' do it 'returns the expected string' do
@expected = "Enumerating Most Popular #{type.capitalize}" @expected = "Enumerating Most Popular #{type.capitalize} (via Aggressive Methods)"
end end
end end
end end

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Controller::PasswordAttack do describe WPScan::Controller::PasswordAttack do
subject(:controller) { described_class.new } subject(:controller) { described_class.new }
let(:target_url) { 'http://ex.lo/' } let(:target_url) { 'http://ex.lo/' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
def it_calls_the_formatter_with_the_correct_parameter(version) def it_calls_the_formatter_with_the_correct_parameter(version)
it 'calls the formatter with the correct parameter' do it 'calls the formatter with the correct parameter' do
expect(controller.formatter).to receive(:output) expect(controller.formatter).to receive(:output)

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::ConfigBackups::KnownFilenames do describe WPScan::Finders::ConfigBackups::KnownFilenames do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::ConfigBackups::Base do describe WPScan::Finders::ConfigBackups::Base do
subject(:config_backups) { described_class.new(target) } subject(:config_backups) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::DbExports::KnownLocations do describe WPScan::Finders::DbExports::KnownLocations do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::DbExports::Base do describe WPScan::Finders::DbExports::Base do
subject(:db_exports) { described_class.new(target) } subject(:db_exports) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::BackupDB do describe WPScan::Finders::InterestingFindings::BackupDB do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::DebugLog do describe WPScan::Finders::InterestingFindings::DebugLog do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::DuplicatorInstallerLog do describe WPScan::Finders::InterestingFindings::DuplicatorInstallerLog do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::EmergencyPwdResetScript do describe WPScan::Finders::InterestingFindings::EmergencyPwdResetScript do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::FullPathDisclosure do describe WPScan::Finders::InterestingFindings::FullPathDisclosure do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::MuPlugins do describe WPScan::Finders::InterestingFindings::MuPlugins do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::Multisite do describe WPScan::Finders::InterestingFindings::Multisite do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::Readme do describe WPScan::Finders::InterestingFindings::Readme do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::Registration do describe WPScan::Finders::InterestingFindings::Registration do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::TmmDbMigrate do describe WPScan::Finders::InterestingFindings::TmmDbMigrate do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::UploadDirectoryListing do describe WPScan::Finders::InterestingFindings::UploadDirectoryListing do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::UploadSQLDump do describe WPScan::Finders::InterestingFindings::UploadSQLDump do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::InterestingFindings::Base do describe WPScan::Finders::InterestingFindings::Base do
subject(:files) { described_class.new(target) } subject(:files) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::MainTheme::CssStyle do describe WPScan::Finders::MainTheme::CssStyle do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::MainTheme::UrlsInHomepage do describe WPScan::Finders::MainTheme::UrlsInHomepage do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::MainTheme::WooFrameworkMetaGenerator do describe WPScan::Finders::MainTheme::WooFrameworkMetaGenerator do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::MainTheme::Base do describe WPScan::Finders::MainTheme::Base do
subject(:main_theme) { described_class.new(target) } subject(:main_theme) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Medias::AttachmentBruteForcing do describe WPScan::Finders::Medias::AttachmentBruteForcing do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Medias::Base do describe WPScan::Finders::Medias::Base do
subject(:media) { described_class.new(target) } subject(:media) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::PluginVersion::Readme do describe WPScan::Finders::PluginVersion::Readme do
subject(:finder) { described_class.new(plugin) } subject(:finder) { described_class.new(plugin) }
let(:plugin) { WPScan::Plugin.new('spec', target) } let(:plugin) { WPScan::Plugin.new('spec', target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
# If this file is tested alone (rspec path-to-this-file), then there will be an error about # If this file is tested alone (rspec path-to-this-file), then there will be an error about
# constants not being intilialized. This is due to the Dynamic Finders. # constants not being intilialized. This is due to the Dynamic Finders.

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::BodyPattern do describe WPScan::Finders::Plugins::BodyPattern do
it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::Comment do describe WPScan::Finders::Plugins::Comment do
it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::ConfigParser do describe WPScan::Finders::Plugins::ConfigParser do
xit xit

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::HeaderPattern do describe WPScan::Finders::Plugins::HeaderPattern do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::JavascriptVar do describe WPScan::Finders::Plugins::JavascriptVar do
it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::KnownLocations do describe WPScan::Finders::Plugins::KnownLocations do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::QueryParameter do describe WPScan::Finders::Plugins::QueryParameter do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::UrlsInHomepage do describe WPScan::Finders::Plugins::UrlsInHomepage do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::Xpath do describe WPScan::Finders::Plugins::Xpath do
it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do it_behaves_like WPScan::Finders::DynamicFinder::WpItems::Finder do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Plugins::Base do describe WPScan::Finders::Plugins::Base do
subject(:plugins) { described_class.new(target) } subject(:plugins) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::ThemeVersion::Style do describe WPScan::Finders::ThemeVersion::Style do
subject(:finder) { described_class.new(theme) } subject(:finder) { described_class.new(theme) }
let(:theme) { WPScan::Theme.new('spec', target) } let(:theme) { WPScan::Theme.new('spec', target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::ThemeVersion::WooFrameworkMetaGenerator do describe WPScan::Finders::ThemeVersion::WooFrameworkMetaGenerator do
subject(:finder) { described_class.new(theme) } subject(:finder) { described_class.new(theme) }
let(:theme) { WPScan::Theme.new(slug, target) } let(:theme) { WPScan::Theme.new(slug, target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::ThemeVersion::Base do describe WPScan::Finders::ThemeVersion::Base do
subject(:theme_version) { described_class.new(theme) } subject(:theme_version) { described_class.new(theme) }
let(:theme) { WPScan::Plugin.new(slug, target) } let(:theme) { WPScan::Plugin.new(slug, target) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Themes::KnownLocations do describe WPScan::Finders::Themes::KnownLocations do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Themes::UrlsInHomepage do describe WPScan::Finders::Themes::UrlsInHomepage do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Themes::Base do describe WPScan::Finders::Themes::Base do
subject(:themes) { described_class.new(target) } subject(:themes) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::TimthumbVersion::BadRequest do describe WPScan::Finders::TimthumbVersion::BadRequest do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Timthumb.new(url) } let(:target) { WPScan::Timthumb.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::TimthumbVersion::Base do describe WPScan::Finders::TimthumbVersion::Base do
subject(:timthumb_version) { described_class.new(target) } subject(:timthumb_version) { described_class.new(target) }
let(:target) { WPScan::Timthumb.new(url) } let(:target) { WPScan::Timthumb.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Timthumbs::KnownLocations do describe WPScan::Finders::Timthumbs::KnownLocations do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Timthumbs::Base do describe WPScan::Finders::Timthumbs::Base do
subject(:timthumb) { described_class.new(target) } subject(:timthumb) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::AuthorIdBruteForcing do describe WPScan::Finders::Users::AuthorIdBruteForcing do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::AuthorPosts do describe WPScan::Finders::Users::AuthorPosts do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::LoginErrorMessages do describe WPScan::Finders::Users::LoginErrorMessages do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::OembedApi do describe WPScan::Finders::Users::OembedApi do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::RSSGenerator do describe WPScan::Finders::Users::RSSGenerator do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,15 +1,17 @@
require 'spec_helper'
describe WPScan::Finders::Users::WpJsonApi do describe WPScan::Finders::Users::WpJsonApi do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }
let(:url) { 'http://wp.lab/' } let(:url) { 'http://wp.lab/' }
let(:fixtures) { File.join(FINDERS_FIXTURES, 'users', 'wp_json_api') } let(:fixtures) { FINDERS_FIXTURES.join('users', 'wp_json_api') }
describe '#aggressive' do describe '#aggressive' do
before { allow(target).to receive(:sub_dir).and_return(false) }
context 'when only one page of results' do
before do before do
allow(target).to receive(:sub_dir).and_return(false) stub_request(:get, finder.api_url)
stub_request(:get, finder.api_url).to_return(body: body) .with(query: { page: 1, per_page: 100 })
.to_return(body: body, headers: {})
end end
context 'when not a JSON response' do context 'when not a JSON response' do
@@ -20,13 +22,13 @@ describe WPScan::Finders::Users::WpJsonApi do
context 'when a JSON response' do context 'when a JSON response' do
context 'when unauthorised' do context 'when unauthorised' do
let(:body) { File.read(File.join(fixtures, '401.json')) } let(:body) { File.read(fixtures.join('401.json')) }
its(:aggressive) { should eql([]) } its(:aggressive) { should eql([]) }
end end
context 'when limited exposure (WP >= 4.7.1)' do context 'when limited exposure (WP >= 4.7.1)' do
let(:body) { File.read(File.join(fixtures, '4.7.2.json')) } let(:body) { File.read(fixtures.join('4.7.2.json')) }
it 'returns the expected array of users' do it 'returns the expected array of users' do
users = finder.aggressive users = finder.aggressive
@@ -38,9 +40,42 @@ describe WPScan::Finders::Users::WpJsonApi do
expect(user.id).to eql 1 expect(user.id).to eql 1
expect(user.username).to eql 'admin' expect(user.username).to eql 'admin'
expect(user.confidence).to eql 100 expect(user.confidence).to eql 100
expect(user.interesting_entries).to eql ['http://wp.lab/wp-json/wp/v2/users/'] expect(user.interesting_entries).to eql ['http://wp.lab/wp-json/wp/v2/users/?page=1&per_page=100']
end end
end end
end end
end end
context 'when multiple pages of results' do
before do
stub_request(:get, finder.api_url)
.with(query: { page: 1, per_page: 100 })
.to_return(body: File.read(fixtures.join('4.7.2.json')), headers: { 'X-WP-TotalPages' => 2 })
stub_request(:get, finder.api_url)
.with(query: { page: 2, per_page: 100 })
.to_return(body: File.read(fixtures.join('4.7.2-2.json')), headers: { 'X-WP-TotalPages' => 2 })
end
it 'returns the expected array of users' do
users = finder.aggressive
expect(users.size).to eql 2
user = users.first
expect(user.id).to eql 1
expect(user.username).to eql 'admin'
expect(user.confidence).to eql 100
expect(user.interesting_entries).to eql ['http://wp.lab/wp-json/wp/v2/users/?page=1&per_page=100']
user = users.second
expect(user.id).to eql 20
expect(user.username).to eql 'user'
expect(user.confidence).to eql 100
expect(user.interesting_entries).to eql ['http://wp.lab/wp-json/wp/v2/users/?page=2&per_page=100']
end
end
end
end end

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::YoastSeoAuthorSitemap do describe WPScan::Finders::Users::YoastSeoAuthorSitemap do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::Users::Base do describe WPScan::Finders::Users::Base do
subject(:user) { described_class.new(target) } subject(:user) { described_class.new(target) }
let(:target) { WPScan::Target.new(url) } let(:target) { WPScan::Target.new(url) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::WpVersion::AtomGenerator do describe WPScan::Finders::WpVersion::AtomGenerator do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::WpVersion::RDFGenerator do describe WPScan::Finders::WpVersion::RDFGenerator do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::WpVersion::Readme do describe WPScan::Finders::WpVersion::Readme do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::WpVersion::RSSGenerator do describe WPScan::Finders::WpVersion::RSSGenerator do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Finders::WpVersion::UniqueFingerprinting do describe WPScan::Finders::WpVersion::UniqueFingerprinting do
subject(:finder) { described_class.new(target) } subject(:finder) { described_class.new(target) }
let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) } let(:target) { WPScan::Target.new(url).extend(CMSScanner::Target::Server::Apache) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
# If this file is tested alone (rspec path-to-this-file), then there will be an error about # If this file is tested alone (rspec path-to-this-file), then there will be an error about
# constants not being intilialized. This is due to the Dynamic Finders. # constants not being intilialized. This is due to the Dynamic Finders.

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::InterestingFinding do describe WPScan::InterestingFinding do
it_behaves_like WPScan::References do it_behaves_like WPScan::References do
subject(:finding) { described_class.new('http://e.org/file.php', opts) } subject(:finding) { described_class.new('http://e.org/file.php', opts) }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Media do describe WPScan::Media do
subject(:media) { described_class.new(url) } subject(:media) { described_class.new(url) }
let(:url) { 'http://e.oeg/?attachment_id=2' } let(:url) { 'http://e.oeg/?attachment_id=2' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Plugin do describe WPScan::Plugin do
subject(:plugin) { described_class.new(slug, blog, opts) } subject(:plugin) { described_class.new(slug, blog, opts) }
let(:slug) { 'spec' } let(:slug) { 'spec' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Theme do describe WPScan::Theme do
subject(:theme) { described_class.new(slug, blog, opts) } subject(:theme) { described_class.new(slug, blog, opts) }
let(:slug) { 'spec' } let(:slug) { 'spec' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::Timthumb do describe WPScan::Timthumb do
subject(:timthumb) { described_class.new(url, opts) } subject(:timthumb) { described_class.new(url, opts) }
let(:url) { 'http://wp.lab/wp-content/timthumb.php' } let(:url) { 'http://wp.lab/wp-content/timthumb.php' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::WpItem do describe WPScan::WpItem do
subject(:wp_item) { described_class.new(slug, blog, opts) } subject(:wp_item) { described_class.new(slug, blog, opts) }
let(:slug) { 'test_item' } let(:slug) { 'test_item' }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::WpVersion do describe WPScan::WpVersion do
describe '#new' do describe '#new' do
context 'when invalid number' do context 'when invalid number' do
@@ -91,11 +89,23 @@ describe WPScan::WpVersion do
subject(:version) { described_class.new('3.8.1') } subject(:version) { described_class.new('3.8.1') }
its(:release_date) { should eql '2014-01-23' } its(:release_date) { should eql '2014-01-23' }
context 'when the version is not in the DB' do
subject(:version) { described_class.new('3.8.2') }
its(:release_date) { should eql 'Unknown' }
end
end end
describe '#status' do describe '#status' do
subject(:version) { described_class.new('3.8.1') } subject(:version) { described_class.new('3.8.1') }
its(:status) { should eql 'outdated' } its(:status) { should eql 'outdated' }
context 'when the version is not in the DB' do
subject(:version) { described_class.new('3.8.2') }
its(:release_date) { should eql 'Unknown' }
end
end end
end end

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe WPScan::XMLRPC do describe WPScan::XMLRPC do
subject(:xml_rpc) { described_class.new('http//e.org/xmlrpc.php') } subject(:xml_rpc) { described_class.new('http//e.org/xmlrpc.php') }

View File

@@ -1,5 +1,3 @@
require 'spec_helper'
describe 'App::Views' do describe 'App::Views' do
let(:target_url) { 'http://ex.lo/' } let(:target_url) { 'http://ex.lo/' }
let(:target) { WPScan::Target.new(target_url) } let(:target) { WPScan::Target.new(target_url) }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,341 @@
# Copyright (C) 2018 Joel James
# This file is distributed under the GPL-2.0+.
msgid ""
msgstr ""
"Project-Id-Version: 404 to 301 3.0.1\n"
"Report-Msgid-Bugs-To: https://duckdev.com/products/404-to-301/\n"
"POT-Creation-Date: 2018-08-24 08:32:46+00:00\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n"
"Last-Translator: Joel James <me@joelsays.com>\n"
"Language-Team: Joel James <me@joelsays.com>\n"
"Language: en\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-Country: United States\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: "
"__;_e;_x:1,2c;_ex:1,2c;_n:1,2;_nx:1,2,4c;_n_noop:1,2;_nx_noop:1,2,3c;esc_"
"attr__;esc_html__;esc_attr_e;esc_html_e;esc_attr_x:1,2c;esc_html_x:1,2c;\n"
"X-Poedit-Basepath: ../\n"
"X-Poedit-SearchPath-0: .\n"
"X-Poedit-Bookmarks: \n"
"X-Textdomain-Support: yes\n"
"X-Generator: grunt-wp-i18n1.0.2\n"
#: includes/admin/class-jj4t3-admin.php:127
msgid "Custom Redirect"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:151
#: includes/admin/class-jj4t3-admin.php:212
#: includes/admin/class-jj4t3-log-listing.php:47
msgid "404 Error Logs"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:151
msgid "404 Errors"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:157
msgid "404 to 301 Settings"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:157
msgid "404 Settings"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:186
msgid "Error Logs"
msgstr ""
#. Plugin Name of the plugin/theme
msgid "404 to 301"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:339 includes/admin/views/admin.php:27
msgid "Settings"
msgstr ""
#: includes/admin/class-jj4t3-admin.php:340
msgid "Logs"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:46
msgid "404 Error Log"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:328
#: includes/functions/jj4t3-general-functions.php:317
msgid "Date"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:329
#: includes/functions/jj4t3-general-functions.php:318
#: includes/public/class-jj4t3-404-email.php:193
msgid "404 Path"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:330
#: includes/functions/jj4t3-general-functions.php:319
msgid "From"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:331
#: includes/functions/jj4t3-general-functions.php:320
#: includes/public/class-jj4t3-404-email.php:198
msgid "IP Address"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:332
#: includes/functions/jj4t3-general-functions.php:321
msgid "User Agent"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:333
msgid "Customization"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:475
msgid "Are you sure you want to delete this item?"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:477
msgid "Delete"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:624
#: includes/admin/views/custom-redirect.php:17
#: includes/admin/views/custom-redirect.php:25
#: includes/admin/views/custom-redirect.php:33
msgid "Default"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:626
msgid "Customize"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:696
msgid "Delete Selected"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:697
msgid "Delete All"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:698
msgid "Delete All (Keep redirects)"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:735
msgid "Group by"
msgstr ""
#: includes/admin/class-jj4t3-log-listing.php:740
msgid "Apply"
msgstr ""
#: includes/admin/views/admin.php:21
msgid "by <a href=\"%s\">Joel James</a>"
msgstr ""
#: includes/admin/views/custom-redirect.php:11
msgid "Redirecting from"
msgstr ""
#: includes/admin/views/custom-redirect.php:15
#: includes/functions/jj4t3-general-functions.php:322
msgid "Redirect"
msgstr ""
#: includes/admin/views/custom-redirect.php:18
#: includes/admin/views/custom-redirect.php:26
#: includes/admin/views/custom-redirect.php:34
msgid "Enable"
msgstr ""
#: includes/admin/views/custom-redirect.php:19
#: includes/admin/views/custom-redirect.php:27
#: includes/admin/views/custom-redirect.php:35
msgid "Disable"
msgstr ""
#: includes/admin/views/custom-redirect.php:23
msgid "Error logging"
msgstr ""
#: includes/admin/views/custom-redirect.php:31
msgid "Email alert"
msgstr ""
#: includes/admin/views/custom-redirect.php:39
#: includes/admin/views/settings.php:30
msgid "Redirect to"
msgstr ""
#: includes/admin/views/custom-redirect.php:42
msgid ""
"Enter the url if you want to set custom redirect for above 404 path. Enter "
"the full url including http://. Leave empty if you want to follow deafult "
"settings."
msgstr ""
#: includes/admin/views/custom-redirect.php:51
#: includes/admin/views/settings.php:17
msgid "Redirect type"
msgstr ""
#: includes/admin/views/custom-redirect.php:58
msgid "Select redirect type to override default one."
msgstr ""
#: includes/admin/views/custom-redirect.php:65
msgid "Save Redirect"
msgstr ""
#: includes/admin/views/settings.php:24
msgid "Learn more"
msgstr ""
#: includes/admin/views/settings.php:24
msgid "about these redirect types"
msgstr ""
#: includes/admin/views/settings.php:33 includes/admin/views/settings.php:37
msgid "Existing Page"
msgstr ""
#: includes/admin/views/settings.php:34 includes/admin/views/settings.php:38
#: includes/admin/views/settings.php:52
msgid "Custom URL"
msgstr ""
#: includes/admin/views/settings.php:35 includes/admin/views/settings.php:39
msgid "No Redirect"
msgstr ""
#: includes/admin/views/settings.php:37
msgid "Select any WordPress page as a 404 page"
msgstr ""
#: includes/admin/views/settings.php:38
msgid "Redirect 404 requests to a specific URL"
msgstr ""
#: includes/admin/views/settings.php:39
msgid "To disable redirect"
msgstr ""
#: includes/admin/views/settings.php:40
msgid ""
"You can override this by setting individual custom redirects from error "
"logs list."
msgstr ""
#: includes/admin/views/settings.php:44
msgid "Select the page"
msgstr ""
#: includes/admin/views/settings.php:47
msgid "The default 404 page will be replaced by the page you choose in this list."
msgstr ""
#: includes/admin/views/settings.php:48
msgid ""
"You can <a href=\"%s\" target=\"_blank\">create a custom 404</a> page and "
"assign that page here."
msgstr ""
#: includes/admin/views/settings.php:55
msgid "Enter any url (including http://)"
msgstr ""
#: includes/admin/views/settings.php:59
msgid "Log 404 Errors"
msgstr ""
#: includes/admin/views/settings.php:62
msgid "Enable/Disable Logging"
msgstr ""
#: includes/admin/views/settings.php:66
msgid "Email notifications"
msgstr ""
#: includes/admin/views/settings.php:69
msgid ""
"If you check this, an email will be sent on every 404 log on the admin "
"email account."
msgstr ""
#: includes/admin/views/settings.php:73
msgid "Email address"
msgstr ""
#: includes/admin/views/settings.php:77
msgid "Change the recipient email address for error log notifications."
msgstr ""
#: includes/admin/views/settings.php:81
msgid "Exclude paths"
msgstr ""
#: includes/admin/views/settings.php:84
msgid "If you want to exclude few paths from error logs, enter here. One per line."
msgstr ""
#: includes/admin/views/settings.php:89
msgid "Save settings"
msgstr ""
#: includes/functions/jj4t3-general-functions.php:283
msgid "301 Redirect (SEO)"
msgstr ""
#: includes/functions/jj4t3-general-functions.php:284
msgid "302 Redirect"
msgstr ""
#: includes/functions/jj4t3-general-functions.php:285
msgid "307 Redirect"
msgstr ""
#: includes/public/class-jj4t3-404-email.php:141
msgid "Snap! One more 404 on "
msgstr ""
#: includes/public/class-jj4t3-404-email.php:189
msgid "Bummer! You have one more 404"
msgstr ""
#: includes/public/class-jj4t3-404-email.php:203
msgid "Time"
msgstr ""
#: includes/public/class-jj4t3-404-email.php:208
msgid "Referral Page"
msgstr ""
#: includes/public/class-jj4t3-404-email.php:213
msgid "Alert sent by the %s404 to 301%s plugin for WordPress."
msgstr ""
#. Plugin URI of the plugin/theme
msgid "https://duckdev.com/products/404-to-301/"
msgstr ""
#. Description of the plugin/theme
msgid ""
"Automatically redirect all <strong>404 errors</strong> to any page using "
"<strong>301 redirect for SEO</strong>. You can <strong>redirect and "
"log</strong> every 404 errors. No more 404 errors in Webmaster tool."
msgstr ""
#. Author of the plugin/theme
msgid "Joel James"
msgstr ""
#. Author URI of the plugin/theme
msgid "https://duckdev.com/"
msgstr ""

View File

@@ -0,0 +1,372 @@
/* Version: 1.2.1 */
jQuery(document).ready(function($){
var to=(function(){var timers={};return function(callback,ms,x_id){if(!x_id){x_id='';}if(timers[x_id]){clearTimeout(timers[x_id]);}timers[x_id]=setTimeout(callback,ms);};})(),id,xstyle,xtop,slr=300,show_popup=false,allottedtime,expiration,ifautofit = 0,rd_bxslider,ads_scrolltop,ae,aeii,ae_popup_title,ae_multiple,ae_loading = false,ae_upload_type,ae_media_type,ae_submit_text,ae_key;
String.prototype.number_format = (function(d){
var n = this,c = isNaN(d = Math.abs(d)) ? 2 : d,s = n < 0 ? "-" : "",i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
return s + (j ? i.substr(0, j) + ',' : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + ',') + (c ? '.' + Math.abs(n - i).toFixed(c).slice(2) : "");
});
var xa, xthis,xattach_id = 0,
xb = $( '.ae-ua-upload .ae-upload' ),
xc = $( '.ae-ua-upload .ae-new' ),
xd = $( '.ae-ua-upload .ae-crop-wrap' ),
xe = $( '.ae-ua-upload .ae-img-wrap' ),
xawidth = parseInt( xb.attr( 'data-width' ) ),
xawidth = ( xawidth ? xawidth : 300 ),
xaheight = parseInt( xb.attr( 'data-height' ) ),
xaheight = ( xaheight ? xaheight : 300 ),
xboundaryw = xawidth + 200,
xboundaryh = xaheight + 100;
if( window.innerWidth <= xboundaryw ){
xboundaryw = 300,
xboundaryh = 200;
xcroppie();
}else{
xcroppie();
}
function xcroppie(){
xc.on( 'click', function() {
xb.trigger( 'click' );
});
$( '.ae-ua-upload .edit-image' ).on( 'click', function() {
if( ! xb.val() ){
xb.trigger( 'click' );
xc.hide();
}else{
xc.show();
xd.fadeIn( function(){});
}
});
$( '.ae-ua-upload .ae-cancel' ).on( 'click', function () {
xd.fadeOut();
});
xb.on( 'change', function () {
xthis = this;
if( ! xa ){
xa = $( '.ae-ua-upload .ae-crop' ).croppie({
enableExif: true,
viewport: {
width: xawidth,
height: xaheight,
type: 'square'
},
boundary: {
width: xboundaryw,
height: xboundaryh
}
});
}
if( xa ){
xd.fadeIn(function(){
var xreader = new FileReader();
xreader.onload = (function (e) {
xa.croppie( 'bind', {
url: e.target.result
}).then(function(){});
});
if( xthis.files.length ){
xreader.readAsDataURL( xthis.files[0] );
}
});
}
});
$( '.ae-ua-upload .ae-save' ).on( 'click', function () {
xa.croppie( 'result', {
type: 'base64',
size: 'original'
}).then(function ( resp ){
if( xthis.files.length ){
var xfiledata = xthis.files[0];
$.ajax({
type : "POST",
url : ae_addon.ajaxurl,
data : {
action : 'user_avatar_upload',
base64 : resp,
file : xb.val(),
filename : xfiledata.name,
filetype : xfiledata.type,
attach_id : xattach_id,
key : xb.data( 'key' ),
},
beforeSend: function( response ) {
if( ! xd.find( '#save-loading' ).length ){
xd.find( '.cr-boundary' ).append( '<img id="save-loading" src="' + ae_addon.spinner2x + '" />' );
}
},
success: function( response ){
if(response){
var data = JSON.parse(response);
xattach_id = data.attach_id;
if( data.attach_id ){
xe.find( 'img.image' ).attr( 'src', data.attach_url ).parent( '.ae-img-wrap' ).addClass( 'ae-img-active' );
xd.find( '#save-loading' ).remove();
xd.fadeOut();
}else{
xe.find( 'img.image' ).parent( '.ae-img-wrap' ).removeClass( 'ae-img-active' );
xd.fadeOut();
xd.find( '#save-loading' ).remove();
alert( 'ERROR #1: something went wrong !!!' );
}
}else{
xe.find( 'img.image' ).parent( '.ae-img-wrap' ).removeClass( 'ae-img-active' );
xd.fadeOut();
xd.find( '#save-loading' ).remove();
alert( 'ERROR #2: something went wrong !!!' );
}
},
});
}
});
});
}
var a, _this,attach_id = 0,
b = $( '.ae-upload .ae-upload' ),
c = $( '.ae-upload .ae-new' ),
d = $( '.ae-upload .ae-crop-wrap' ),
e = $( '.ae-upload .ae-img-wrap' ),
awidth = parseInt( b.attr( 'data-width' ) ),
awidth = ( awidth ? awidth : 300 ),
aheight = parseInt( b.attr( 'data-height' ) ),
aheight = ( aheight ? aheight : 300 ),
boundaryw = awidth + 200,
boundaryh = aheight + 100;
if( window.innerWidth <= boundaryw ){
boundaryw = 300,
boundaryh = 200;
croppie();
}else{
croppie();
}
function croppie(){
c.on( 'click', function() {
b.trigger( 'click' );
});
$( '.ae-upload .edit-image' ).on( 'click', function() {
if( ! b.val() ){
b.trigger( 'click' );
c.hide();
}else{
c.show();
d.fadeIn( function(){});
}
});
$( '.ae-upload .ae-cancel' ).on( 'click', function () {
d.fadeOut();
});
b.on( 'change', function () {
_this = this;
if( ! a ){
a = $( '.ae-upload .ae-crop' ).croppie({
enableExif: true,
viewport: {
width: awidth,
height: aheight,
type: 'square'
},
boundary: {
width: boundaryw,
height: boundaryh
}
});
}
if( a ){
d.fadeIn(function(){
var reader = new FileReader();
reader.onload = (function (e) {
a.croppie( 'bind', {
url: e.target.result
}).then(function(){
/*console.log( 'jQuery bind complete' );*/
});
});
if( _this.files.length ){
reader.readAsDataURL( _this.files[0] );
}
});
}
});
$( '.ae-upload .ae-save' ).on( 'click', function () {
a.croppie( 'result', {
type: 'base64',
size: 'original'
}).then(function ( resp ){
if( _this.files.length ){
var filedata = _this.files[0];
$.ajax({
type : "POST",
url : ae_addon.ajaxurl,
data : {
action : 'single_image_crop',
base64 : resp,
file : b.val(),
filename : filedata.name,
filetype : filedata.type,
attach_id : attach_id,
key : $(b.attr( 'data-id' )).attr( 'id' ),
},
beforeSend: function( response ) {
if( ! d.find( '#save-loading' ).length ){
d.find( '.cr-boundary' ).append( '<img id="save-loading" src="' + ae_addon.spinner2x + '" />' );
}
},
success: function( response ){
if(response){
var data = JSON.parse(response);
attach_id = data.attach_id;
if( data.attach_id && $(b.attr( 'data-id' )).length ){
e.find( 'img.image' ).attr( 'src', data.attach_url ).parent( '.ae-img-wrap' ).addClass( 'ae-img-active' );
$(b.attr( 'data-id' )).val( data.attach_url );
d.find( '#save-loading' ).remove();
d.fadeOut();
}else{
e.find( 'img.image' ).parent( '.ae-img-wrap' ).removeClass( 'ae-img-active' );
d.fadeOut();
d.find( '#save-loading' ).remove();
alert( 'ERROR #3: something went wrong !!!' );
}
}else{
e.find( 'img.image' ).parent( '.ae-img-wrap' ).removeClass( 'ae-img-active' );
d.fadeOut();
d.find( '#save-loading' ).remove();
alert( 'ERROR #4: something went wrong !!!' );
}
},
});
}
});
});
}
if($('#apmediaupload').length){
$(document).delegate('#apmediaupload','click',function(){
if(ae_loading){return;}
ae_filed_id = $(this).attr('field_id');
ae_popup_title = String($(this).attr('popup_title'));
ae_multiple = $(this).attr('multiple');
ae_upload_type = $(this).attr('upload_type');
ae_media_type = $(this).attr('media_type');
ae_submit_text = $(this).attr('submit_text');
ae_key = $(this).attr('key');
if(ae_multiple == 'true'){
ae_multiple = true;
}else if(ae_multiple == 'add'){
ae_multiple = 'add';
}else{
ae_multiple = false;
}
if(ae_media_type == 'image'){
ae = wp.media.frames.file_frame = wp.media({
multiple: ae_multiple,
title: ae_popup_title,
type: ae_media_type,
library:{type: ae_media_type},
button:{text : ae_submit_text},
});
ae.on('select', function(){
attachment = ae.state().get('selection').toJSON();
var ids = [];
var images = [];
for (i = 0; i < attachment.length; i++){
ids[i] = attachment[i]['id'];
images[i] = attachment[i]['url'];
}
if(! ids){return;}
if(ae_upload_type == 'single'){
ids = ids[0];
}
$.ajax({
type : "POST",
url : ae.ajaxurl,
data :{
action : 'ae_ajax',
ids : ids,
multiple : ae_multiple,
type : ae_upload_type,
media_type : ae_media_type,
},
beforeSend: function(response){
ae_loading = true;
if(ae_upload_type == 'single'){
$('.agfmu-' + ae_filed_id.replace('#','').replace(' ','')).css({
'background-image' : "url('" + ae.homeurl + "/wp-includes/images/spinner-2x.gif')",
'background-position' : 'center center',
'background-repeat' : 'no-repeat',
'background-size' : 'auto',
});
}
},
success: function(response){
if(response && ae_upload_type == 'single'){
$(ae_filed_id).val(response);
}
if(response && ae_upload_type == 'gallery'){
var data = JSON.parse(response);
$(ae_filed_id).val(data.ids);
}
if(response && ae_upload_type == 'single'){
$('.agfmu-' + ae_filed_id.replace('#','').replace(' ','')).css({
'background-image' : 'url('+images[0]+')',
'background-size' : 'auto',
});
}
if(response && ae_upload_type == 'gallery'){
var data = JSON.parse(response);
$('#gallery-' + ae_filed_id.replace('#', '').replace(' ', '')).html(data.preview);
}
setTimeout(function(){
ae_loading = false;
}, 300);
},
});
});
ae.on('open', function(){
var selection = ae.state().get('selection');
ids = $('input' + ae_filed_id).val();
if(ids){
ids = ids.split(",");
if(ids){
ids.forEach(function(id){
attachments = wp.media.attachment(id);
attachments.fetch();
selection.add(attachments ? [ attachments ] : []);
});
}
}
});
ae.open();
}
});
}
$( window ).on( 'resize', function(){
to(function(){
if( window.innerWidth <= boundaryw ){
a.destroy();
boundaryw = 300,
boundaryh = 200;
croppie();
}
},200);
});
function ajax_search(id){
name = $(id).attr('name');
if(! $(id).val()){$('.rd-ajax .sr').html('').hide(); return;}
$('.rd-ajax .sr').html('<span class="loading">&nbsp;</span>');
to(function(){
$.ajax({
url : ae.ajaxurl,
type : 'post',
data :{
action : 'location_ajax',
value : $(id).val(),
name : name
},
success : function(data){
$('.rd-ajax .sr').html(data).show();
}
});
}, 200);
}
});

View File

@@ -0,0 +1,19 @@
{
"name": "my-block-cgb-guten-block",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "cgb-scripts start",
"build": "cgb-scripts build",
"eject": "cgb-scripts eject"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^1.2.12",
"@fortawesome/free-brands-svg-icons": "^5.6.3",
"@fortawesome/free-regular-svg-icons": "^5.6.3",
"@fortawesome/free-solid-svg-icons": "^5.6.3",
"@fortawesome/react-fontawesome": "^0.1.3",
"cgb-scripts": "1.13.0",
"classnames": "^2.2.6"
}
}

View File

@@ -0,0 +1,7 @@
{
"name": "andrejpavlovic/acf-conditional-logic-advanced",
"description": "Adds an Advanced Conditional Logic field setting to ACF that can show/hide individual fields based on post template, format, and/or category.",
"version": "1.1.3",
"type": "wordpress-plugin",
"license": "GPL-2.0"
}

View File

@@ -0,0 +1,412 @@
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Ad Blocks 1.0.0\n"
"POT-Creation-Date: 2019-01-29 02:40+0200\n"
"PO-Revision-Date: 2016-07-05 22:59+0300\n"
"Last-Translator: \n"
"Language-Team: Sergey Kravchenko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Language: ru\n"
"X-Poedit-KeywordsList: __;_e;esc_attr_e;_x;_n\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: .\n"
"X-Poedit-SearchPathExcluded-0: includes/plugins/cmb2\n"
#: includes/class-calendar-functions.php:49
#: includes/class-calendar-functions.php:63
msgid "Sun"
msgstr ""
#: includes/class-calendar-functions.php:50
#: includes/class-calendar-functions.php:57
msgid "Mon"
msgstr ""
#: includes/class-calendar-functions.php:51
#: includes/class-calendar-functions.php:58
msgid "Tue"
msgstr ""
#: includes/class-calendar-functions.php:52
#: includes/class-calendar-functions.php:59
msgid "Wed"
msgstr ""
#: includes/class-calendar-functions.php:53
#: includes/class-calendar-functions.php:60
msgid "Thu"
msgstr ""
#: includes/class-calendar-functions.php:54
#: includes/class-calendar-functions.php:61
msgid "Fri"
msgstr ""
#: includes/class-calendar-functions.php:55
#: includes/class-calendar-functions.php:62
msgid "Sat"
msgstr ""
#: includes/class-calendar-functions.php:76
#: includes/class-calendar-functions.php:90
msgid "Su"
msgstr ""
#: includes/class-calendar-functions.php:77
#: includes/class-calendar-functions.php:84
msgid "Mo"
msgstr ""
#: includes/class-calendar-functions.php:78
#: includes/class-calendar-functions.php:85
msgid "Tu"
msgstr ""
#: includes/class-calendar-functions.php:79
#: includes/class-calendar-functions.php:86
msgid "We"
msgstr ""
#: includes/class-calendar-functions.php:80
#: includes/class-calendar-functions.php:87
msgid "Th"
msgstr ""
#: includes/class-calendar-functions.php:81
#: includes/class-calendar-functions.php:88
msgid "Fr"
msgstr ""
#: includes/class-calendar-functions.php:82
#: includes/class-calendar-functions.php:89
msgid "Sa"
msgstr ""
#: includes/class-cmb2-admin.php:90
msgid "Shortcode options"
msgstr ""
#: includes/class-cmb2-admin.php:100
msgid "Shortcode name param"
msgstr ""
#: includes/class-cmb2-admin.php:111
msgid "Auto posting"
msgstr ""
#: includes/class-cmb2-admin.php:121
msgid "Auto add to posts"
msgstr ""
#: includes/class-cmb2-admin.php:125 includes/class-settings-admin.php:348
msgid "No"
msgstr ""
#: includes/class-cmb2-admin.php:126 includes/class-settings-admin.php:347
msgid "Yes"
msgstr ""
#: includes/class-cmb2-admin.php:132
msgid "Insert location"
msgstr ""
#: includes/class-cmb2-admin.php:136
msgid "Before content"
msgstr ""
#: includes/class-cmb2-admin.php:137
msgid "After content"
msgstr ""
#: includes/class-cmb2-admin.php:143
msgid "Post types"
msgstr ""
#: includes/class-post-types.php:56 includes/class-post-types.php:57
msgid "Ad Block"
msgstr ""
#: includes/class-post-types.php:58 includes/class-post-types.php:59
#: includes/class-post-types.php:65 includes/class-post-types.php:76
#: includes/widgets/class-adblocks.php:10
msgid "Ad Blocks"
msgstr ""
#: includes/class-post-types.php:60
msgid "Add new"
msgstr ""
#: includes/class-post-types.php:61
msgid "Add New Ad Block"
msgstr ""
#: includes/class-post-types.php:62
msgid "New Ad Block"
msgstr ""
#: includes/class-post-types.php:63
msgid "Edit Ad Block"
msgstr ""
#: includes/class-post-types.php:64
msgid "View Ad Block"
msgstr ""
#: includes/class-post-types.php:66
msgid "Search Ad Block"
msgstr ""
#: includes/class-post-types.php:67
msgid "Parent Ad Block:"
msgstr ""
#: includes/class-post-types.php:68
msgid "Not found."
msgstr ""
#: includes/class-post-types.php:69
msgid "Not found in Trash."
msgstr ""
#: includes/class-post-types.php:70
msgid "Update Ad Block"
msgstr ""
#: includes/class-posts-admin.php:37
msgid "Shortcode"
msgstr ""
#: includes/class-posts-admin.php:38
msgid "Date"
msgstr ""
#: includes/class-settings-admin.php:55
#: includes/class-settings-admin.php:56
#: includes/class-settings-admin.php:74
msgid "Ad Blocks Settings"
msgstr ""
#: includes/class-settings-admin.php:184
msgid "General"
msgstr ""
#: includes/class-settings-admin.php:191
msgid "Use classic editor for Ad Block post type"
msgstr ""
#: includes/class-settings-admin.php:200
msgid "Date format"
msgstr ""
#: includes/class-settings-admin.php:279
msgid "Upload"
msgstr ""
#: includes/class-settings-admin.php:287
msgid "Custom Image"
msgstr ""
#: includes/class-settings-admin.php:289
msgid "Upload Image"
msgstr ""
#: includes/class-settings-admin.php:361
msgid "d/m/Y"
msgstr ""
#: includes/class-settings-admin.php:362
msgid "m/d/Y"
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Base.php:422
#, php-format
msgid ""
"The \"%1$s\" field parameter has been deprecated in favor of the \"%2$s"
"\" parameter."
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Base.php:426
#, php-format
msgid ""
"Using the \"%1$s\" field parameter as a callback has been deprecated in "
"favor of the \"%2$s\" parameter."
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Base.php:456
#, php-format
msgid ""
"%1$s was called with a parameter that is <strong>deprecated</strong> "
"since version %2$s! %3$s"
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Base.php:458
#, php-format
msgid ""
"%1$s was called with a parameter that is <strong>deprecated</strong> "
"since version %2$s with no alternative available."
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_JS.php:200
msgid "mm/dd/yy"
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_JS.php:220
msgid "hh:mm TT"
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Options_Hookup.php:139
msgid "Nothing to update."
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Options_Hookup.php:143
msgid "Settings updated."
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_Types.php:232
msgid "Custom CMB2 field type classes must extend CMB2_Type_Base."
msgstr ""
#: includes/vendors/cmb2/includes/CMB2_hookup.php:466
#, php-format
msgid "Toggle panel: %s"
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller.php:257
msgid "This box does not have read permissions."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller.php:277
msgid "This box does not have write permissions."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller.php:300
msgid ""
"No box found by that id. A box needs to be registered with the "
"\"show_in_rest\" parameter configured."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller.php:378
msgid "A human-readable description of the object."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller.php:385
msgid "The id for the object."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller.php:392
msgid "The title for the object."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php:51
msgid "Includes the registered fields for the box in the response."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php:72
msgid ""
"Includes the fully rendered attributes, 'form_open', 'form_close', as "
"well as the enqueued 'js_dependencies' script handles, and "
"'css_dependencies' stylesheet handles."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Boxes.php:122
msgid "No boxes found."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:27
msgid ""
"Includes the box object which the fields are registered to in the "
"response."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:30
msgid ""
"When the '_rendered' argument is passed, the renderable field attributes "
"will be returned fully rendered. By default, the names of the callback "
"handers for the renderable attributes will be returned."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:33
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:36
msgid ""
"To view or modify the field's value, the 'object_id' and 'object_type' "
"arguments are required."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:236
msgid ""
"CMB2 Field value cannot be updated without the value parameter specified."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:297
msgid ""
"CMB2 Field value cannot be modified without the object_id and "
"object_type parameters specified."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:312
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:341
msgid "No field found by that id."
msgstr ""
#: includes/vendors/cmb2/includes/rest-api/CMB2_REST_Controller_Fields.php:415
#, php-format
msgid "Value Error for %s"
msgstr ""
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:25
#, php-format
msgid "Method '%s' must be overridden."
msgstr ""
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:35
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:47
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:59
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:71
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:83
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:95
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:107
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:119
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:131
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:143
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:155
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:168
#, php-format
msgid "Method '%s' not implemented. Must be overridden in subclass."
msgstr ""
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:273
msgid "Current page of the collection."
msgstr ""
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:281
msgid "Maximum number of items to be returned in result set."
msgstr ""
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:290
msgid "Limit results to those matching a string."
msgstr ""
#: includes/vendors/cmb2/includes/shim/WP_REST_Controller.php:308
msgid ""
"Scope under which the request is made; determines fields present in "
"response."
msgstr ""
#: includes/widgets/class-adblocks.php:12
msgid "Show Ad Blocks"
msgstr ""
#: includes/widgets/class-adblocks.php:51
msgid "Title:"
msgstr ""
#: includes/widgets/class-adblocks.php:56
msgid "Ad block name(s):"
msgstr ""

View File

@@ -0,0 +1,20 @@
{
"name": "adrecord-affiliate",
"version": "1.0.0",
"private": true,
"dependencies": {
"react": "^16.7.0",
"react-dom": "^16.7.0",
"react-toggle-component": "^1.0.5",
"react-wp-scripts": "0.2.0",
"styled-components": "^4.1.3"
},
"scripts": {
"start": "react-wp-scripts start",
"build": "react-scripts build",
"make-pot": "wp i18n make-pot . --exclude=src,build --debug",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject",
"zip": "zip ../adrecord-affiliate.zip -r build src public adrecord-affiliate.php react-wp-scripts.php readme.txt yarn.lock languages php package.json build-tools.md"
}
}

View File

@@ -0,0 +1,118 @@
# Copyright (C) 2019 Adrecord
# This file is distributed under the same license as the Adrecord Affiliate plugin.
msgid ""
msgstr ""
"Project-Id-Version: Adrecord Affiliate 1.0.0\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/adrecord-affiliate\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-01-24T13:33:13+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: WP-CLI 2.1.0\n"
"X-Domain: adrecord\n"
#. Plugin Name of the plugin
msgid "Adrecord Affiliate"
msgstr ""
#. Plugin URI of the plugin
msgid "https://wordpress.org/plugins/adrecord-affiliate/"
msgstr ""
#. Description of the plugin
msgid "Adrecords WordPress plugin for affiliates. Easily enable and make use of clean links and other features right in your WordPress site."
msgstr ""
#. Author of the plugin
msgid "Adrecord"
msgstr ""
#. Author URI of the plugin
msgid "https://www.adrecord.com"
msgstr ""
#: php/App.php:176
msgid "Loading"
msgstr ""
#: php/LanguageDictionary.php:7
msgid "Welcome to the Adrecord Wordpress plugin"
msgstr ""
#: php/LanguageDictionary.php:8
msgid "To get started, enter your API-key to connect with your account at Adrecord."
msgstr ""
#: php/LanguageDictionary.php:9
msgid "Welcome"
msgstr ""
#: php/LanguageDictionary.php:10
msgid "API-key:"
msgstr ""
#: php/LanguageDictionary.php:11
msgid "You can find your API-key "
msgstr ""
#: php/LanguageDictionary.php:12
msgid "in the Adrecord dashboard advanced section."
msgstr ""
#: php/LanguageDictionary.php:13
msgid "Clean links enabled:"
msgstr ""
#: php/LanguageDictionary.php:14
msgid "Clean links is a technique for linking to advertisers with \"regular links\", for example, directly to http://www.example.com instead of https://click.adrecord.com/?p=19&c=TEST. When you have enabled clean links and have entered a regular link to one of your advertisers in your content, please try to click one of your links and make sure you can see the clicks counting in the Adrecord dashboard."
msgstr ""
#: php/LanguageDictionary.php:15
msgid "Latest programs"
msgstr ""
#: php/LanguageDictionary.php:16
msgid "About Adrecord"
msgstr ""
#: php/LanguageDictionary.php:17
msgid ""
"Adrecord is an affiliate network with long experience and broad \n"
" knowledge that helps with affiliate marketing in a friendly and\n"
" transparent way."
msgstr ""
#: php/LanguageDictionary.php:20
msgid ""
"With our help you can set up and administer an affiliate program\n"
" according to your terms, we will take full responsibility for\n"
" the technology, finance and support, and create relationships\n"
" with talented affiliates."
msgstr ""
#: php/LanguageDictionary.php:24
msgid "Get started with Adrecord"
msgstr ""
#: php/LanguageDictionary.php:25
msgid ""
"Don't have an affiliate account at Adrecord? No worries, just\n"
" sign up for free here and "
msgstr ""
#: php/LanguageDictionary.php:27
msgid "create your account here."
msgstr ""
#: php/LanguageDictionary.php:28
msgid ""
"For more information on how to get started, please have a look\n"
" at our "
msgstr ""
#: php/LanguageDictionary.php:30
msgid "quick-start guide."
msgstr ""

View File

@@ -0,0 +1,17 @@
{
"name": "my-block-cgb-guten-block",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "cgb-scripts start",
"build": "cgb-scripts build",
"eject": "cgb-scripts eject"
},
"dependencies": {
"cgb-scripts": "1.13.0",
"classnames": "^2.2.6",
"moment": "^2.23.0",
"query-string": "^6.2.0",
"querystringify": "^2.1.0"
}
}

View File

@@ -0,0 +1,167 @@
/*Default Plugin Styles*/
/*plugin version 4.0.3.3*/
a[target="amazonwin"] {margin: 0 !important;}
a[rel^="appiplightbox"] { display: inline-block; font-size: .75rem; text-align: center; max-width: 100%; }
.instock { color: #008000; font-size: .85em; }
.outofstock { color: #800000; font-size: .85em; }
.amazon-image-wrapper { padding: 0 1%; text-align: center;float: left; margin: 0 2% 0 0;-webkit-box-sizing: border-box;-moz-box-sizing: border-box; box-sizing: border-box; max-width: 25%; width: 100%; }
.amazon-image-wrapper a { border-bottom: none; display: block; font-size: 12px; text-align: center; }
.amazon-image-wrapper br {display: none;}
.asin-title {text-align: left; font-size: inherit;}
.appip-label {color: #666; font-size: inherit;font-weight: bold;text-transform: uppercase;}
.appip-multi-divider {margin: 10px 0;}
.amazon-asin-title {margin: 0 0 5px 0; }
.amazon-author { color: #666; }
.amazon-buying {text-align: left; box-sizing: border-box; float: left; max-width: 73%; width: 100%; }
.amazon-dates { padding: 0 !important; text-align: left; height: auto;}
.amazon-dates br {display: none;}
.amazon-dates .amazon-preorder { color: #d16601; font-weight: bold; text-align: left; }
.amazon-dates .amazon-release-date { color: #666; font-size: 10px; text-align: left; }
.amazon-director { color: #666; }
.amazon-director-label { color: #999; }
.amazon-ESRB { color: #666; font-size : 12px;}
.amazon-feature { color: #666; font-size : inherit;}
.amazon-manufacturer { color: #666; }
.amazon-new { color: #800000; font-weight: bold; text-align: left; }
.amazon-new-label { color: #666; text-align: left;}
.amazon-platform { color: #666; font-size : 12px;}
.amazon-post-text { padding: 0 !important; text-align: left; }
.amazon-price-label { color: #666; text-align: left; }
.amazon-price { color: #800000; font-weight: bold; text-align: left; }
.amazon-rating { color: #666; }
.amazon-rating-label { color: #999; }
.amazon-starring { color: #666; }
.amazon-starring-label { color: #999; }
.amazon-system { color: #666; font-size : 12px;}
.amazon-tiny {text-align: center;font-size: 10px;}
.amazon-used { color: #666; text-align: left; }
.amazon-used-label { color: #666; text-align: left; }
.amazon-list-price { text-align: left; text-decoration: line-through; }
.amazon-list-price-label { color: #666; text-align: left; }
.amazon-list-price-label, .amazon-new-label, .amazon-used-label { font-weight: bold; min-width: 7em;width: auto;}
.amazon-product-table { border-collapse: collapse; border: 0 none !important; width: 100%; clear: both; margin-bottom: 10px;}
.amazon-product-table td{ border: 0 none ; padding: 0; }
.amazon-product-table:after {clear: both;}
.amazon-product-table a { border-bottom: 0 none; text-decoration: none; }
.amazon-product-table > tbody > tr > td {padding: .5rem !important;}
.amazon-product-table hr {display:inline-block;max-width:100%; width: 100%; border-top: 1px solid #e2e5e7;height: 0px; margin: 6px 0;}
.amazon-product-table .amazon-buying h2.amazon-asin-title { border-bottom: 0 none; font-size: 1rem; line-height: 1.25em; margin: 0; }
.amazon-product-table .amazon-list-variants {border-top: 1px solid #CCC;border-bottom: 1px solid #ccc;padding: 2%;margin-top:2%;}
.amazon-product-price { border-collapse: collapse; border: 0 none; padding: 0 !important; }
.amazon-product-price { -moz-border-radius: 0; -webkit-border-radius: 0; border-collapse: collapse; border-radius: 0; border: 0 none; margin: 0; max-width: 100%; width: auto; }
.amazon-product-price { float: left; margin: 0; width: 100%; }
.amazon-product-price a img.amazon-image { background-color: transparent; border: 0 none; }
.amazon-product-price td { border: 0 none !important; padding: .25em 0; }
.amazon-product-price td { padding: 1%; width: auto; }
.amazon-product-price tr:first-child td {width:7em;}
.amazon-price-button{margin-top:2%;display:block;}
.amazon-price-button > a{display:block;margin-top:8px;margin-bottom:5px;width:165px;}
.amazon-price-button > a img.amazon-price-button-img{border:0 none;margin:0px;background:transparent;}
.amazon-additional-images-text { display: block; font-size: x-small; font-weight: bold; }
.amazon-element-imagesets { border: 1px solid #ccc; display: inline-block; margin: 5px; overflow: hidden; padding: 10px; }
.amazon-element-imagesets br {display: none;}
.amazon-element-imagesets a { float: left; margin: 3px; }
.amazon-element-imagesets a img {border: 1px solid #fff;}
.amazon-additional-images-wrapper { border: 1px solid #ccc; box-sizing: border-box; display: inline-block; margin: 1%; overflow: hidden; padding: 2%; }
.amazon-additional-images-wrapper a { float: left; margin: 3px; }
.amazon-additional-images-wrapper a img {border: 1px solid #fff;width:25px;}
.amazon-additional-images-wrapper br {display: none;}
.amazon_variations_wrapper{}
.amazon_varients{}
.amazon-varient-type-link {display: inline-block;font-weight: bold;}
.amazon-varient-type-price {display: inline-block;color: #EA0202;font-weight: bold;}
.amazon-variant-price-text{color:initial;}
.amazon-variant-price-text {font-weight: normal;}
.amazon-elements-wrapper,
.amazon-element-wrapper{clear: both;}
img.amazon-varient-image {max-width: 50px;margin: 1%;padding: 1px;background-color: #999;}
img.amazon-varient-image:hover {background-color: #3A9AD9;}
/*
a.amazon__price--button--style,
a.amazon__price--button--style:visited {background-color: #444;padding: 10px 20px;margin: 5px 0;display: inline-block;text-decoration: none;color: #fff;-moz-transition: all .5s ease;-webkit-transition: all .5s ease;transition: all .5s ease;}
a.amazon__price--button--style:hover {background-color: #2196F3;text-decoration: none;color: #fff;}
a.amazon__price--button--style:focus,
a.amazon__price--button--style:active{outline: 0;-moz-box-shadow:0 0 5px #2196F3;-webkit-box-shadow:0 0 5px #2196F3;box-shadow: 0 0 5px #2196F3;}
a.amazon__price--button--style{ background-color: #2196F3;text-decoration: none;color: #fff;}
*/
body[class*=amp-mode] .amazon-image-wrapper a amp-img img{height:auto;position:relative;}
body[class*=amp-mode] .amazon-image-wrapper a amp-img>*{padding:0;}
body[class*=amp-mode] table{width:100%;background:0 0}
body[class*=amp-mode] .amazon-buying{padding:4px}
body[class*=amp-mode] .amazon-image-wrapper{margin:0;background:0 0;padding:4px}
body[class*=amp-mode] .amazon-buying hr{border-style:solid;border-width:0 0 1px;border-color:#ccc}
body[class*=amp-mode] h2.amazon-asin-title{max-width:100%;font-size:1.3em;line-height:1.35;background:0 0}
body[class*=amp-mode] .amazon-product-pricing-wrap{max-width:100%}
body[class*=amp-mode] .amazon-product-pricing-wrap table tr td{border:0;background:0 0;margin:0;padding:0 2px;display:inline-block;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}
body[class*=amp-mode] .amazon-product-pricing-wrap table tr{border:0;background:0 0;margin:0;padding:2px;text-align:left}
body[class*=amp-mode] .amazon-image-wrapper amp-img{width:160px;margin:0 auto;max-width:100%}
body[class*=amp-mode] .amazon-image-wrapper>a{display:block;text-align:center}
body[class*=amp-mode] .amazon-image-wrapper>br{display:none}
body[class*=amp-mode] .amazon-product-pricing-wrap table tr td:last-child:first-child,
body[class*=amp-mode] .amazon-product-pricing-wrap tbody,
body[class*=amp-mode] .amazon-product-pricing-wrap tr{width:100%;display:block}
body[class*=amp-mode] .amazon-price-button amp-img{margin:0 auto}
body[class*=amp-mode] p.amazon-asin-title{margin-bottom:0;font-size:1.25em;line-height:1.35}
body[class*=amp-mode] .amazon-product-pricing-wrap table{background:0 0}
body[class*=amp-mode] .amazon-image-wrapper .amazon-additional-images-wrapper amp-img{width:50px;display:inline-block;margin:0 2px}
body[class*=amp-mode] span.amazon-additional-images-text{display:block}
body[class*=amp-mode] .amazon-additional-images-wrapper{line-height:1.25;text-align:center}
body[class*=amp-mode] .amazon-additional-images-wrapper br{display:none}
.appip-clear { clear: both; }
.appip-debug .appip-errors { display: block !important; color: #FEFEFE; background: #cd0000; padding: 1%; font-weight: bold; font-size: 16px; }
/* New Flat Button Styles 4.0.3.3*/
.button-rounded{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
/* default */
.amazon__price--button--style,
.amazon__price--button--style:visited {background-color: #444;padding: 10px 20px;margin: 5px 0;display: inline-block;text-decoration: none;color: #fff;-moz-transition: all .5s ease;-webkit-transition: all .5s ease;transition: all .5s ease;}
.amazon__price--button--style:hover {cursor:pointer;background-color: #666;text-decoration: none;color: #fff;}
.amazon__price--button--style:focus {color: #fff;background-color: #595959;outline: 0;-moz-box-shadow: 0 0 5px #9c9c9c;-webkit-box-shadow: 0 0 5px #9c9c9c;box-shadow: 0 0 5px #9c9c9c;text-decoration: none;}
.amazon__price--button--style:active {color: #fff;background-color: #595959;outline: 0;text-decoration: none;-moz-box-shadow:0px 3px 9px rgba(0, 0, 0, 0.43) inset;-webkit-box-shadow:0px 3px 9px rgba(0, 0, 0, 0.43) inset;box-shadow:0px 3px 9px rgba(0, 0, 0, 0.43) inset;}
/* blue */
.amazon__btn--blue,
.amazon__btn--blue:visited{color: #fff;background-color: #0085ba;}
.amazon__btn--blue:hover {color: #fff;background-color: #008ec2;}
.amazon__btn--blue:focus {color: #fff;background-color: #0073aa;-moz-box-shadow: 0 0 5px #2196F3;-webkit-box-shadow: 0 0 5px #2196F3;box-shadow: 0 0 5px #2196F3;}
.amazon__btn--blue:active{color: #fff;background-color: #0073aa;}
/* red */
.amazon__btn--red,
.amazon__btn--red:visited{color: #fff;background-color: #e10505;}
.amazon__btn--red:hover {color: #fff;background-color: #f00;}
.amazon__btn--red:focus {color: #fff;background-color: #a70707;-moz-box-shadow: 0 0 5px #ff338e;-webkit-box-shadow: 0 0 5px #ff338e;box-shadow: 0 0 5px #ff338e;}
.amazon__btn--red:active{color: #fff;background-color: #a70707;}
/* green */
.amazon__btn--green,
.amazon__btn--green:visited{color: #fff;background-color: #4aa74e;}
.amazon__btn--green:hover {color: #fff;background-color: #2f8d33;}
.amazon__btn--green:focus {color: #fff;background-color: #17851c;-moz-box-shadow: 0 0 5px #8BC34A;-webkit-box-shadow: 0 0 5px #8BC34A;box-shadow: 0 0 5px #8BC34A;}
.amazon__btn--green:active{color: #fff;background-color: #17851c;}
@media screen and (min-width:550px){
body[class*=amp-mode] .amazon-image-wrapper{float:left;width:28%}
body[class*=amp-mode] .amazon-buying{float:left;width:70%}
body[class*=amp-mode] .amazon-price-button amp-img{margin:5px 0 0}
body[class*=amp-mode] p.amazon-asin-title{margin-bottom:12px}
}
@media only screen and (max-width : 1200px) {}
@media only screen and (max-width : 992px) {}
@media only screen and (max-width : 768px) {}
@media only screen and (max-width : 550px) {
.amazon-image-wrapper { padding: 0; text-align: center; float: none; margin: 0 auto 2%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; max-width: 75%; width: 100%; }
.amazon-buying { box-sizing: border-box; float: none; max-width: 100%; width: 100%; }
.amazon-product-price,table.amazon-product-price { float: none; margin: 0; max-width: 100%; width: 100%; }
.amazon-product-pricing-wrap { display: block; clear: both; }
.amazon-dates { text-align: center; }
.amazon-dates a { margin: 0 auto !important; width: 50% !important; }
.amazon-dates a img { margin: 5% auto 0 !important; width: 95% !important; }
span.amazon-tiny {margin-top: 2px;background: #ccc;padding:1%;display: block;font-size: 1.25em;color: #000;text-transform: uppercase;border: 1px solid #999;line-height: 1.25em;}
span.amazon-tiny:active {background: #EDEDED;}
.amazon-product-table .amazon-buying h2.amazon-asin-title {margin-top: 3%;display: block;line-height: 1.5em;}
.amazon-additional-images-wrapper { max-width: 100%; width: 100%; margin: 1% 0; text-align: center; }
.amazon-additional-images-wrapper a { float: none; display: inline-block; width: 18%; margin: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
.amazon-additional-images-wrapper a img { width: 75%; }
td.amazon-list-price-label, td.amazon-new-label, td.amazon-used-label, td.amazon-used-price, td.amazon-new, td.amazon-list-price { display: inline-block; }
a.amazon__price--button--style {max-width: 90%;margin: 5px auto;}
}
@media only screen and (max-width : 320px) {}
/* Custom Styles*/

View File

@@ -0,0 +1,800 @@
# Copyright (C) 2018 Angelleye PayPal Invoicing
# This file is distributed under the same license as the Angelleye PayPal Invoicing package.
msgid ""
msgstr ""
"Project-Id-Version: Angelleye PayPal Invoicing 1.0.0\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/angelleye-paypal-"
"invoicing\n"
"POT-Creation-Date: 2018-10-09 12:30+0530\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-10-09 13:01+0530\n"
"Language-Team: \n"
"X-Generator: Poedit 2.1.1\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en_US\n"
#: admin/class-angelleye-paypal-invoicing-admin.php:120
msgid "Would you like to delete the invoice at PayPal?"
msgstr "Would you like to delete the invoice at PayPal?"
#: admin/class-angelleye-paypal-invoicing-admin.php:140
msgid "Manage invoices"
msgstr "Manage invoices"
#: admin/class-angelleye-paypal-invoicing-admin.php:141
msgid "PayPal invoice"
msgstr "PayPal invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:142
msgctxt "Manage invoices"
msgid "Manage invoices"
msgstr "Manage invoices"
#: admin/class-angelleye-paypal-invoicing-admin.php:143
msgid "Add invoice"
msgstr "Add invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:144
#: admin/class-angelleye-paypal-invoicing-admin.php:437
msgid "Add New invoice"
msgstr "Add New invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:145
msgid "Edit"
msgstr "Edit"
#: admin/class-angelleye-paypal-invoicing-admin.php:146
msgid "Invoice Details"
msgstr "Invoice Details"
#: admin/class-angelleye-paypal-invoicing-admin.php:147
msgid "New invoice"
msgstr "New invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:148
#: admin/class-angelleye-paypal-invoicing-admin.php:149
msgid "View PayPal invoice"
msgstr "View PayPal invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:150
msgid "Search PayPal invoices"
msgstr "Search PayPal invoices"
#: admin/class-angelleye-paypal-invoicing-admin.php:151
msgid "No PayPal invoice found"
msgstr "No PayPal invoice found"
#: admin/class-angelleye-paypal-invoicing-admin.php:152
msgid "No PayPal invoice found in trash"
msgstr "No PayPal invoice found in trash"
#: admin/class-angelleye-paypal-invoicing-admin.php:153
msgid "Parent PayPal invoice"
msgstr "Parent PayPal invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:155
msgid "This is where you can add new PayPal Invoice to your store."
msgstr "This is where you can add new PayPal Invoice to your store."
#: admin/class-angelleye-paypal-invoicing-admin.php:303
msgid ""
"PayPal API credentials is not set up, <a href=\"?page=apifw_settings\" class="
"\"alert-link\">Click here to set up</a>."
msgstr ""
"PayPal API credentials is not set up, <a href=\"?page=apifw_settings\" class="
"\"alert-link\">Click here to set up</a>."
#: admin/class-angelleye-paypal-invoicing-admin.php:321
msgid "Your settings have been saved."
msgstr "Your settings have been saved."
#: admin/class-angelleye-paypal-invoicing-admin.php:371
msgid "Successfully deleted log files."
msgstr "Successfully deleted log files."
#: admin/class-angelleye-paypal-invoicing-admin.php:446
msgid "Invoice ID"
msgstr "Invoice ID"
#: admin/class-angelleye-paypal-invoicing-admin.php:447
msgctxt "angelleye-paypal-invoicing"
msgid "Date"
msgstr "Date"
#: admin/class-angelleye-paypal-invoicing-admin.php:448
#: admin/views/html-admin-page-invoice-list.php:22
#: admin/views/html-admin-page-invoice-list.php:53
#: admin/views/html-admin-page-template_list.php:21
#: admin/views/html-admin-page-template_list.php:40
msgid "Invoice #"
msgstr "Invoice #"
#: admin/class-angelleye-paypal-invoicing-admin.php:449
msgctxt "angelleye-paypal-invoicing"
msgid "Recipient"
msgstr "Recipient"
#: admin/class-angelleye-paypal-invoicing-admin.php:450
#: admin/views/html-admin-page-invoice-list.php:24
#: admin/views/html-admin-page-invoice-list.php:55
#: admin/views/html-admin-page-template_list.php:23
#: admin/views/html-admin-page-template_list.php:42
msgid "Status"
msgstr "Status"
#: admin/class-angelleye-paypal-invoicing-admin.php:451
#: admin/views/html-admin-page-create-invoice.php:106
#: admin/views/html-admin-page-create-invoice.php:116
#: admin/views/html-admin-page-invoice-list.php:25
#: admin/views/html-admin-page-invoice-list.php:56
#: admin/views/html-admin-page-template_list.php:25
#: admin/views/html-admin-page-template_list.php:44
#: admin/views/html-admin-page-view-invoice.php:174
msgid "Amount"
msgstr "Amount"
#: admin/class-angelleye-paypal-invoicing-admin.php:607
#: admin/views/html-admin-page-view-invoice.php:39
msgid "View PayPal Invoice"
msgstr "View PayPal Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:610
#: admin/class-angelleye-paypal-invoicing-admin.php:625
#: admin/views/html-admin-page-create-invoice.php:21
#: admin/views/html-admin-page-create-invoice.php:232
#: admin/views/html-admin-page-view-invoice.php:42
msgid "Send Invoice"
msgstr "Send Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:611
#: admin/class-angelleye-paypal-invoicing-admin.php:628
#: admin/views/html-admin-page-view-invoice.php:43
msgid "Delete Invoice"
msgstr "Delete Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:614
#: admin/class-angelleye-paypal-invoicing-admin.php:626
#: admin/views/html-admin-page-view-invoice.php:46
msgid "Send Invoice Reminder"
msgstr "Send Invoice Reminder"
#: admin/class-angelleye-paypal-invoicing-admin.php:617
#: admin/class-angelleye-paypal-invoicing-admin.php:627
#: admin/views/html-admin-page-view-invoice.php:49
msgid "Cancel Invoice"
msgstr "Cancel Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:643
#: admin/class-angelleye-paypal-invoicing-admin.php:766
msgid "You sent a invoice to %1$s"
msgstr "You sent a invoice to %1$s"
#: admin/class-angelleye-paypal-invoicing-admin.php:657
#: admin/class-angelleye-paypal-invoicing-admin.php:775
msgid "You sent a payment reminder to %1$s"
msgstr "You sent a payment reminder to %1$s"
#: admin/class-angelleye-paypal-invoicing-admin.php:670
#: admin/class-angelleye-paypal-invoicing-admin.php:979
msgid "You canceled this invoice."
msgstr "You canceled this invoice."
#: admin/class-angelleye-paypal-invoicing-admin.php:703
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:22
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:181
msgid "PayPal Invoice"
msgstr "PayPal Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:704
msgid "paypal_invoice"
msgstr "paypal_invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:783
msgid "You canceled this invoice"
msgstr "You canceled this invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:849
msgid "Save PayPal Invoice Draft"
msgstr "Save PayPal Invoice Draft"
#: admin/class-angelleye-paypal-invoicing-admin.php:850
#: admin/class-angelleye-paypal-invoicing-admin.php:862
msgid "Send PayPal Invoice"
msgstr "Send PayPal Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:856
msgid "Send PayPal Invoice Reminder"
msgstr "Send PayPal Invoice Reminder"
#: admin/class-angelleye-paypal-invoicing-admin.php:859
msgid "Cancel PayPal Invoice"
msgstr "Cancel PayPal Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:863
msgid "Delete PayPal Invoice"
msgstr "Delete PayPal Invoice"
#: admin/class-angelleye-paypal-invoicing-admin.php:886
msgid "Your invoice is created."
msgstr "Your invoice is created."
#: admin/class-angelleye-paypal-invoicing-admin.php:892
#: admin/class-angelleye-paypal-invoicing-admin.php:934
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:253
msgctxt "PayPal Invoice"
msgid "Awaiting payment"
msgstr "Awaiting payment"
#: admin/class-angelleye-paypal-invoicing-admin.php:918
#: admin/class-angelleye-paypal-invoicing-admin.php:928
msgid "We've sent your invoice."
msgstr "We've sent your invoice."
#: admin/class-angelleye-paypal-invoicing-admin.php:958
msgid "Your reminder is sent."
msgstr "Your reminder is sent."
#: admin/class-angelleye-paypal-invoicing-admin.php:1004
msgid "Your invoice is deleted."
msgstr "Your invoice is deleted."
#: admin/views/html-admin-page-create-invoice.php:22
#: admin/views/html-admin-page-create-invoice.php:233
msgid "Save as Draft"
msgstr "Save as Draft"
#: admin/views/html-admin-page-create-invoice.php:30
msgid "Invoice number"
msgstr "Invoice number"
#: admin/views/html-admin-page-create-invoice.php:35
msgid ""
"Invoices are numbered automatically beginning with invoice number 0001. You "
"can customize the invoice number any way you'd like, and the next number "
"will increment by 1."
msgstr ""
"Invoices are numbered automatically beginning with invoice number 0001. You "
"can customize the invoice number any way you'd like, and the next number "
"will increment by 1."
#: admin/views/html-admin-page-create-invoice.php:39
msgid "Invoice date"
msgstr "Invoice date"
#: admin/views/html-admin-page-create-invoice.php:44
msgid ""
"You can select any invoice date. This invoice will be sent today or on a "
"future date you choose."
msgstr ""
"You can select any invoice date. This invoice will be sent today or on a "
"future date you choose."
#: admin/views/html-admin-page-create-invoice.php:48
msgid "Reference"
msgstr "Reference"
#: admin/views/html-admin-page-create-invoice.php:50
msgid "Such as PO#"
msgstr "Such as PO#"
#: admin/views/html-admin-page-create-invoice.php:54
msgid "Due date"
msgstr "Due date"
#: admin/views/html-admin-page-create-invoice.php:57
msgid "No due date"
msgstr "No due date"
#: admin/views/html-admin-page-create-invoice.php:58
msgid "Due on receipt"
msgstr "Due on receipt"
#: admin/views/html-admin-page-create-invoice.php:59
msgid "Due on date specified"
msgstr "Due on date specified"
#: admin/views/html-admin-page-create-invoice.php:60
msgid "Due in 10 days"
msgstr "Due in 10 days"
#: admin/views/html-admin-page-create-invoice.php:61
msgid "Due in 15 days"
msgstr "Due in 15 days"
#: admin/views/html-admin-page-create-invoice.php:62
msgid "Due in 30 days"
msgstr "Due in 30 days"
#: admin/views/html-admin-page-create-invoice.php:63
msgid "Due in 45 days"
msgstr "Due in 45 days"
#: admin/views/html-admin-page-create-invoice.php:64
msgid "Due in 60 days"
msgstr "Due in 60 days"
#: admin/views/html-admin-page-create-invoice.php:65
msgid "Due in 90 days"
msgstr "Due in 90 days"
#: admin/views/html-admin-page-create-invoice.php:72
msgid "d/m/Y"
msgstr "d/m/Y"
#: admin/views/html-admin-page-create-invoice.php:102
#: admin/views/html-admin-page-view-invoice.php:171
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:86
msgid "Description"
msgstr "Description"
#: admin/views/html-admin-page-create-invoice.php:103
#: admin/views/html-admin-page-view-invoice.php:172
msgid "Quantity"
msgstr "Quantity"
#: admin/views/html-admin-page-create-invoice.php:104
#: admin/views/html-admin-page-view-invoice.php:173
msgid "Price"
msgstr "Price"
#: admin/views/html-admin-page-create-invoice.php:105
msgid "Tax"
msgstr "Tax"
#: admin/views/html-admin-page-create-invoice.php:112
msgid "Item name"
msgstr "Item name"
#: admin/views/html-admin-page-create-invoice.php:113
msgid "0"
msgstr "0"
#: admin/views/html-admin-page-create-invoice.php:114
#: admin/views/html-admin-page-invoice-setting.php:167
msgid "0.00"
msgstr "0.00"
#: admin/views/html-admin-page-create-invoice.php:115
msgid "Name"
msgstr "Name"
#: admin/views/html-admin-page-create-invoice.php:121
msgid "Enter detailed description (optional)"
msgstr "Enter detailed description (optional)"
#: admin/views/html-admin-page-create-invoice.php:130
msgid "Add another line item"
msgstr "Add another line item"
#: admin/views/html-admin-page-create-invoice.php:143
msgid "Allow partial payment"
msgstr "Allow partial payment"
#: admin/views/html-admin-page-create-invoice.php:143
msgid ""
"Your customer will be allowed to enter any payment amount above the minimum "
"until the invoice is paid in full."
msgstr ""
"Your customer will be allowed to enter any payment amount above the minimum "
"until the invoice is paid in full."
#: admin/views/html-admin-page-create-invoice.php:148
msgid "Minimum amount due (optional)"
msgstr "Minimum amount due (optional)"
#: admin/views/html-admin-page-create-invoice.php:160
msgid "Allow customer to add a tip."
msgstr "Allow customer to add a tip."
#: admin/views/html-admin-page-create-invoice.php:169
#: admin/views/html-admin-page-view-invoice.php:227
msgid "Subtotal"
msgstr "Subtotal"
#: admin/views/html-admin-page-create-invoice.php:173
#: admin/views/html-admin-page-view-invoice.php:255
msgid "Discount"
msgstr "Discount"
#: admin/views/html-admin-page-create-invoice.php:186
#: admin/views/html-admin-page-view-invoice.php:235
msgid "Shipping"
msgstr "Shipping"
#: admin/views/html-admin-page-create-invoice.php:194
#: admin/views/html-admin-page-view-invoice.php:263
msgid "Total"
msgstr "Total"
#: admin/views/html-admin-page-create-invoice.php:205
msgid "Note to recipient"
msgstr "Note to recipient"
#: admin/views/html-admin-page-create-invoice.php:205
msgid "Such as Thank you for your business"
msgstr "Such as Thank you for your business"
#: admin/views/html-admin-page-create-invoice.php:208
msgid "Terms and conditions"
msgstr "Terms and conditions"
#: admin/views/html-admin-page-create-invoice.php:208
msgid "Include your return or cancelation policy"
msgstr "Include your return or cancelation policy"
#: admin/views/html-admin-page-create-invoice.php:216
msgid "Add memo to self"
msgstr "Add memo to self"
#: admin/views/html-admin-page-create-invoice.php:219
msgid "Memo"
msgstr "Memo"
#: admin/views/html-admin-page-create-invoice.php:220
msgid "Add memo to self (your recipient won't see this)"
msgstr "Add memo to self (your recipient won't see this)"
#: admin/views/html-admin-page-create-invoice.php:222
msgid "Hide"
msgstr "Hide"
#: admin/views/html-admin-page-invoice-list.php:17
msgid "Manage Invoices"
msgstr "Manage Invoices"
#: admin/views/html-admin-page-invoice-list.php:21
#: admin/views/html-admin-page-invoice-list.php:52
#: admin/views/html-admin-page-template_list.php:20
#: admin/views/html-admin-page-template_list.php:39
msgid "Date"
msgstr "Date"
#: admin/views/html-admin-page-invoice-list.php:23
#: admin/views/html-admin-page-invoice-list.php:54
#: admin/views/html-admin-page-template_list.php:22
#: admin/views/html-admin-page-template_list.php:41
msgid "Recipient"
msgstr "Recipient"
#: admin/views/html-admin-page-invoice-list.php:46
#: admin/views/html-admin-page-template_list.php:33
msgid "You havent created any invoices"
msgstr "You havent created any invoices"
#: admin/views/html-admin-page-invoice-setting.php:45
msgid "PayPal API Credentials"
msgstr "PayPal API Credentials"
#: admin/views/html-admin-page-invoice-setting.php:47
msgid "PayPal Sandbox"
msgstr "PayPal Sandbox"
#: admin/views/html-admin-page-invoice-setting.php:52
msgid "Enable PayPal Sandbox"
msgstr "Enable PayPal Sandbox"
#: admin/views/html-admin-page-invoice-setting.php:59
#: admin/views/html-admin-page-invoice-setting.php:61
msgid "Sandbox PayPal Email"
msgstr "Sandbox PayPal Email"
#: admin/views/html-admin-page-invoice-setting.php:65
#: admin/views/html-admin-page-invoice-setting.php:67
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:115
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:120
msgid "Sandbox Client ID"
msgstr "Sandbox Client ID"
#: admin/views/html-admin-page-invoice-setting.php:71
#: admin/views/html-admin-page-invoice-setting.php:73
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:123
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:128
msgid "Sandbox Secret"
msgstr "Sandbox Secret"
#: admin/views/html-admin-page-invoice-setting.php:78
#: admin/views/html-admin-page-invoice-setting.php:80
msgid "PayPal Email"
msgstr "PayPal Email"
#: admin/views/html-admin-page-invoice-setting.php:84
#: admin/views/html-admin-page-invoice-setting.php:86
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:139
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:144
msgid "Client ID"
msgstr "Client ID"
#: admin/views/html-admin-page-invoice-setting.php:90
#: admin/views/html-admin-page-invoice-setting.php:92
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:147
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:152
msgid "Secret"
msgstr "Secret"
#: admin/views/html-admin-page-invoice-setting.php:95
msgid "Merchant / Business Information"
msgstr "Merchant / Business Information"
#: admin/views/html-admin-page-invoice-setting.php:97
#: admin/views/html-admin-page-invoice-setting.php:99
msgid "First Name"
msgstr "First Name"
#: admin/views/html-admin-page-invoice-setting.php:103
#: admin/views/html-admin-page-invoice-setting.php:105
msgid "Last Name"
msgstr "Last Name"
#: admin/views/html-admin-page-invoice-setting.php:109
#: admin/views/html-admin-page-invoice-setting.php:111
msgid "Company Name"
msgstr "Company Name"
#: admin/views/html-admin-page-invoice-setting.php:115
#: admin/views/html-admin-page-invoice-setting.php:117
msgid "Phone Number"
msgstr "Phone Number"
#: admin/views/html-admin-page-invoice-setting.php:120
msgid "Merchant / Business Address"
msgstr "Merchant / Business Address"
#: admin/views/html-admin-page-invoice-setting.php:122
msgid "Address line 1"
msgstr "Address line 1"
#: admin/views/html-admin-page-invoice-setting.php:124
msgid "House number and street name"
msgstr "House number and street name"
#: admin/views/html-admin-page-invoice-setting.php:128
msgid "Address line 2"
msgstr "Address line 2"
#: admin/views/html-admin-page-invoice-setting.php:130
msgid "Apartment, suite, unit etc."
msgstr "Apartment, suite, unit etc."
#: admin/views/html-admin-page-invoice-setting.php:134
#: admin/views/html-admin-page-invoice-setting.php:136
msgid "City"
msgstr "City"
#: admin/views/html-admin-page-invoice-setting.php:140
msgid "Postcode / ZIP"
msgstr "Postcode / ZIP"
#: admin/views/html-admin-page-invoice-setting.php:146
msgid "State / County"
msgstr "State / County"
#: admin/views/html-admin-page-invoice-setting.php:152
msgid "Country"
msgstr "Country"
#: admin/views/html-admin-page-invoice-setting.php:157
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:155
msgid "Default Values"
msgstr "Default Values"
#: admin/views/html-admin-page-invoice-setting.php:159
msgid "Shipping Rate %"
msgstr "Shipping Rate %"
#: admin/views/html-admin-page-invoice-setting.php:161
#: admin/views/html-admin-page-invoice-setting.php:179
msgid "%"
msgstr "%"
#: admin/views/html-admin-page-invoice-setting.php:165
msgid "Shipping Amount"
msgstr "Shipping Amount"
#: admin/views/html-admin-page-invoice-setting.php:171
msgid "Tax Name"
msgstr "Tax Name"
#: admin/views/html-admin-page-invoice-setting.php:177
msgid "Tax Rate %"
msgstr "Tax Rate %"
#. translators: %s: URL
#: admin/views/html-admin-page-invoice-setting.php:183
#: admin/views/html-admin-page-invoice-setting.php:185
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:161
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:166
msgid "Note to Recipient"
msgstr "Note to Recipient"
#: admin/views/html-admin-page-invoice-setting.php:189
#: admin/views/html-admin-page-invoice-setting.php:191
#: admin/views/html-admin-page-view-invoice.php:288
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:169
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:174
msgid "Terms and Conditions"
msgstr "Terms and Conditions"
#: admin/views/html-admin-page-invoice-setting.php:194
msgid "Log Event"
msgstr "Log Event"
#: admin/views/html-admin-page-invoice-setting.php:196
msgid "Debug Log"
msgstr "Debug Log"
#: admin/views/html-admin-page-invoice-setting.php:202
msgid "Enable logging"
msgstr "Enable logging"
#: admin/views/html-admin-page-invoice-setting.php:205
msgid "Log PayPal events, inside"
msgstr "Log PayPal events, inside"
#: admin/views/html-admin-page-invoice-setting.php:211
#: admin/views/html-admin-page-invoice-setting.php:213
msgid "Delete Logs"
msgstr "Delete Logs"
#: admin/views/html-admin-page-invoice-setting.php:218
msgid "Save changes"
msgstr "Save changes"
#: admin/views/html-admin-page-template_list.php:24
#: admin/views/html-admin-page-template_list.php:43
#: admin/views/html-admin-page-view-invoice.php:34
msgid "Action"
msgstr "Action"
#: admin/views/html-admin-page-view-invoice.php:13
msgid "INVOICE"
msgstr "INVOICE"
#: admin/views/html-admin-page-view-invoice.php:59
msgid "Invoice #:"
msgstr "Invoice #:"
#: admin/views/html-admin-page-view-invoice.php:65
msgid "Invoice date:"
msgstr "Invoice date:"
#: admin/views/html-admin-page-view-invoice.php:71
msgid "Reference:"
msgstr "Reference:"
#: admin/views/html-admin-page-view-invoice.php:77
msgid "Due date:"
msgstr "Due date:"
#: admin/views/html-admin-page-view-invoice.php:88
msgid "Merchant Info"
msgstr "Merchant Info"
#: admin/views/html-admin-page-view-invoice.php:280
msgid "Notes"
msgstr "Notes"
#: includes/class-angelleye-paypal-invoicing-calculations.php:93
msgid "Item"
msgstr "Item"
#: includes/class-angelleye-paypal-invoicing-calculations.php:107
msgid "Fee"
msgstr "Fee"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:21
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:82
msgctxt "PayPal Invoice"
msgid "PayPal Invoice"
msgstr "PayPal Invoice"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:73
msgid "Enable/Disable"
msgstr "Enable/Disable"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:75
msgid "Enable PayPal Invoice"
msgstr "Enable PayPal Invoice"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:79
msgid "Title"
msgstr "Title"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:81
msgid "This controls the title which the user sees during checkout."
msgstr "This controls the title which the user sees during checkout."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:88
msgid "Payment method description that the customer will see on your checkout."
msgstr ""
"Payment method description that the customer will see on your checkout."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:89
msgid ""
"Please send a check to Store Name, Store Street, Store Town, Store State / "
"County, Store Postcode."
msgstr ""
"Please send a check to Store Name, Store Street, Store Town, Store State / "
"County, Store Postcode."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:93
msgid "Instructions"
msgstr "Instructions"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:95
msgid "Instructions that will be added to the thank you page and emails."
msgstr "Instructions that will be added to the thank you page and emails."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:100
msgid "PayPal sandbox"
msgstr "PayPal sandbox"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:102
msgid "Enable PayPal sandbox"
msgstr "Enable PayPal sandbox"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:107
msgid "Sandbox PayPal email"
msgstr "Sandbox PayPal email"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:117
msgid "Get your Sandbox Client ID from PayPal."
msgstr "Get your Sandbox Client ID from PayPal."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:125
msgid "Get your Sandbox Secret from PayPal."
msgstr "Get your Sandbox Secret from PayPal."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:131
msgid "PayPal email"
msgstr "PayPal email"
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:141
msgid "Get your Client ID from PayPal."
msgstr "Get your Client ID from PayPal."
#: includes/class-angelleye-paypal-invoicing-wc-payment.php:149
msgid "Get your Secret from PayPal."
msgstr "Get your Secret from PayPal."
#: includes/class-angelleye-paypal-invoicing.php:249
msgid "Configure"
msgstr "Configure"
#: includes/class-angelleye-paypal-invoicing.php:250
msgid "Docs"
msgstr "Docs"
#: includes/class-angelleye-paypal-invoicing.php:251
msgid "Support"
msgstr "Support"
#: includes/class-angelleye-paypal-invoicing.php:252
msgid "Write a Review"
msgstr "Write a Review"
#. Plugin Name of the plugin/theme
msgid "Angelleye PayPal Invoicing"
msgstr "Angelleye PayPal Invoicing"
#. Plugin URI of the plugin/theme
msgid "http://www.angelleye.com/product/angelleye-paypal-invoicing/"
msgstr "http://www.angelleye.com/product/angelleye-paypal-invoicing/"
#. Description of the plugin/theme
msgid ""
"This is a short description of what the plugin does. It's displayed in the "
"WordPress admin area."
msgstr ""
"This is a short description of what the plugin does. It's displayed in the "
"WordPress admin area."
#. Author of the plugin/theme
msgid "Angell EYE"
msgstr "Angell EYE"
#. Author URI of the plugin/theme
msgid "http://www.angelleye.com/"
msgstr "http://www.angelleye.com/"

Some files were not shown because too many files have changed in this diff Show More