Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
liberty
tunnel
liberty-tunnel-client-library-apple
Commits
047a132c
Commit
047a132c
authored
Dec 13, 2018
by
Jose Blaya
Browse files
Merge branch 'release/1.1.7' into release/2.0.0
parents
e03783b4
16ef6db3
Changes
11
Hide whitespace changes
Inline
Side-by-side
PIALibrary/Sources/Core/Account/AccountProvider.swift
View file @
047a132c
...
...
@@ -65,9 +65,10 @@ public protocol AccountProvider: class {
- Postcondition:
- Posts `Notification.Name.PIAAccountDidUpdate` on success.
- Parameter request: The account update request.
- Parameter password: The credentials to perform the operation.
- Parameter callback: Returns the updated `AccountInfo`.
*/
func
update
(
with
request
:
UpdateAccountRequest
,
_
callback
:
LibraryCallback
<
AccountInfo
>
?)
func
update
(
with
request
:
UpdateAccountRequest
,
andPassword
password
:
String
,
_
callback
:
LibraryCallback
<
AccountInfo
>
?)
/**
Logs out of the system.
...
...
PIALibrary/Sources/Core/Persistence/PlainStore.swift
View file @
047a132c
...
...
@@ -11,9 +11,7 @@ import Foundation
protocol
PlainStore
:
class
{
// MARK: Account
var
publicUsername
:
String
?
{
get
set
}
var
accountInfo
:
AccountInfo
?
{
get
set
}
var
lastSignupEmail
:
String
?
{
get
set
}
...
...
PIALibrary/Sources/Core/Persistence/SecureStore.swift
View file @
047a132c
...
...
@@ -17,6 +17,10 @@ protocol SecureStore: class {
func
setUsername
(
_
username
:
String
?)
func
publicUsername
()
->
String
?
func
setPublicUsername
(
_
username
:
String
?)
func
password
(
for
username
:
String
)
->
String
?
func
setPassword
(
_
password
:
String
?,
for
username
:
String
)
...
...
PIALibrary/Sources/Library/Account/DefaultAccountProvider.swift
View file @
047a132c
...
...
@@ -48,7 +48,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
}
var
publicUsername
:
String
?
{
guard
let
username
=
accessedDatabase
.
plain
.
publicUsername
else
{
guard
let
username
=
accessedDatabase
.
secure
.
publicUsername
()
else
{
return
nil
}
return
username
...
...
@@ -69,7 +69,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
}
set
{
if
let
user
=
newValue
{
accessedDatabase
.
plain
.
p
ublicUsername
=
user
.
credentials
.
username
accessedDatabase
.
secure
.
setP
ublicUsername
(
user
.
credentials
.
username
)
accessedDatabase
.
secure
.
setPassword
(
user
.
credentials
.
password
,
for
:
user
.
credentials
.
username
)
accessedDatabase
.
plain
.
accountInfo
=
user
.
info
}
else
{
...
...
@@ -77,7 +77,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
accessedDatabase
.
secure
.
setPassword
(
nil
,
for
:
username
)
accessedDatabase
.
secure
.
setUsername
(
nil
)
}
accessedDatabase
.
plain
.
p
ublicUsername
=
nil
accessedDatabase
.
secure
.
setP
ublicUsername
(
nil
)
accessedDatabase
.
plain
.
accountInfo
=
nil
}
}
...
...
@@ -111,7 +111,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
let
tokenComponents
=
token
.
split
(
by
:
token
.
count
/
2
)
if
let
first
=
tokenComponents
.
first
,
let
last
=
tokenComponents
.
last
{
self
.
accessedDatabase
.
plain
.
p
ublicUsername
=
username
self
.
accessedDatabase
.
secure
.
setP
ublicUsername
(
username
)
self
.
accessedDatabase
.
secure
.
setUsername
(
first
)
self
.
accessedDatabase
.
secure
.
setToken
(
token
,
for
:
self
.
accessedDatabase
.
secure
.
tokenKey
(
for
:
first
))
...
...
@@ -193,11 +193,13 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
}
}
func
update
(
with
request
:
UpdateAccountRequest
,
_
callback
:
((
AccountInfo
?,
Error
?)
->
Void
)?)
{
func
update
(
with
request
:
UpdateAccountRequest
,
andPassword
password
:
String
,
_
callback
:
((
AccountInfo
?,
Error
?)
->
Void
)?)
{
guard
let
user
=
currentUser
else
{
preconditionFailure
()
}
webServices
.
update
(
credentials
:
user
.
credentials
,
email
:
request
.
email
)
{
(
error
)
in
let
credentials
=
Credentials
(
username
:
Client
.
providers
.
accountProvider
.
publicUsername
??
""
,
password
:
password
)
webServices
.
update
(
credentials
:
credentials
,
email
:
request
.
email
)
{
(
error
)
in
if
let
_
=
error
{
callback
?(
nil
,
error
)
return
...
...
@@ -298,7 +300,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
self
.
accessedStore
.
finishTransaction
(
transaction
,
success
:
true
)
}
self
.
accessedDatabase
.
plain
.
lastSignupEmail
=
nil
self
.
accessedDatabase
.
plain
.
p
ublicUsername
=
credentials
.
username
self
.
accessedDatabase
.
secure
.
setP
ublicUsername
(
credentials
.
username
)
self
.
accessedDatabase
.
secure
.
setPassword
(
credentials
.
password
,
for
:
credentials
.
username
)
let
user
=
UserAccount
(
credentials
:
credentials
,
info
:
nil
)
...
...
@@ -335,7 +337,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
let
tokenComponents
=
token
.
split
(
by
:
token
.
count
/
2
)
if
let
first
=
tokenComponents
.
first
,
let
last
=
tokenComponents
.
last
{
self
.
accessedDatabase
.
plain
.
p
ublicUsername
=
credentials
.
username
self
.
accessedDatabase
.
secure
.
setP
ublicUsername
(
credentials
.
username
)
self
.
accessedDatabase
.
secure
.
setUsername
(
first
)
self
.
accessedDatabase
.
secure
.
setToken
(
token
,
for
:
self
.
accessedDatabase
.
secure
.
tokenKey
(
for
:
first
))
...
...
@@ -444,7 +446,7 @@ class DefaultAccountProvider: AccountProvider, ConfigurationAccess, DatabaseAcce
accessedDatabase
.
secure
.
setUsername
(
nil
)
accessedDatabase
.
secure
.
setToken
(
nil
,
for
:
accessedDatabase
.
secure
.
tokenKey
(
for
:
username
))
}
accessedDatabase
.
plain
.
p
ublicUsername
=
nil
accessedDatabase
.
secure
.
setP
ublicUsername
(
nil
)
accessedDatabase
.
plain
.
accountInfo
=
nil
}
#endif
...
...
PIALibrary/Sources/Library/Client+Database.swift
View file @
047a132c
...
...
@@ -57,9 +57,6 @@ extension Client {
- Returns: `self`
*/
@discardableResult
public
func
truncate
()
->
Self
{
if
let
username
=
plain
.
publicUsername
{
secure
.
clear
(
for
:
username
)
}
plain
.
clear
()
transient
=
MemoryStore
()
return
self
...
...
PIALibrary/Sources/Library/Persistence/KeychainStore.swift
View file @
047a132c
...
...
@@ -78,6 +78,21 @@ extension KeychainStore {
}
}
extension
KeychainStore
{
func
publicUsername
()
->
String
?
{
return
try
?
backend
.
publicUsername
()
}
func
setPublicUsername
(
_
username
:
String
?)
{
if
let
username
=
username
{
try
?
backend
.
set
(
publicUsername
:
username
)
}
else
{
backend
.
removePublicUsername
()
}
}
}
extension
KeychainStore
{
func
token
(
for
username
:
String
)
->
String
?
{
...
...
PIALibrary/Sources/Library/WebServices/Endpoint.swift
View file @
047a132c
...
...
@@ -20,7 +20,9 @@ enum ClientEndpoint: String, Endpoint {
case
token
=
"v2/token"
case
account
=
"v2/account"
case
updateAccount
=
"account"
case
payment
case
status
...
...
PIALibrary/Sources/Library/WebServices/PIAWebServices.swift
View file @
047a132c
...
...
@@ -71,11 +71,11 @@ class PIAWebServices: WebServices, ConfigurationAccess {
}
func
update
(
credentials
:
Credentials
,
email
:
String
,
_
callback
:
SuccessLibraryCallback
?)
{
let
endpoint
=
ClientEndpoint
.
a
ccount
let
endpoint
=
ClientEndpoint
.
updateA
ccount
let
parameters
=
[
"email"
:
email
]
let
status
=
[
200
]
req
(
credentials
,
.
post
,
endpoint
,
parameters
,
status
,
JSONRequestExecutor
()
{
(
json
,
status
,
error
)
in
req
(
credentials
,
.
post
,
endpoint
,
useAuthToken
:
false
,
parameters
,
status
,
JSONRequestExecutor
()
{
(
json
,
status
,
error
)
in
if
let
error
=
error
{
callback
?(
error
)
return
...
...
PIALibrary/Sources/Mock/MockAccountProvider.swift
View file @
047a132c
...
...
@@ -160,8 +160,8 @@ public class MockAccountProvider: AccountProvider, WebServicesConsumer {
}
/// :nodoc:
public
func
update
(
with
request
:
UpdateAccountRequest
,
_
callback
:
((
AccountInfo
?,
Error
?)
->
Void
)
?)
{
delegate
.
update
(
with
:
request
,
callback
)
public
func
update
(
with
request
:
UpdateAccountRequest
,
andPassword
password
:
String
,
_
callback
:
LibraryCallback
<
AccountInfo
>
?)
{
delegate
.
update
(
with
:
request
,
andPassword
:
password
,
callback
)
}
/// :nodoc:
...
...
PIALibrary/Sources/UI/iOS/ViewControllers/PIAWelcomeViewController.swift
View file @
047a132c
...
...
@@ -298,7 +298,7 @@ class EphemeralAccountProvider: AccountProvider, ProvidersAccess, InAppAccess {
fatalError
(
"Not implemented"
)
}
func
update
(
with
request
:
UpdateAccountRequest
,
_
callback
:
((
AccountInfo
?,
Error
?)
->
Void
)?)
{
func
update
(
with
request
:
UpdateAccountRequest
,
andPassword
password
:
String
,
_
callback
:
((
AccountInfo
?,
Error
?)
->
Void
)?)
{
fatalError
(
"Not implemented"
)
}
...
...
PIALibrary/Sources/Util/Keychain.swift
View file @
047a132c
...
...
@@ -28,6 +28,7 @@ public class Keychain {
private
let
accessGroup
:
String
?
private
let
usernameKey
=
"USERNAME_KEY"
private
let
publicUsernameKey
=
"PUBLIC_USERNAME_KEY"
/**
Default initializer. Uses the default keychain associated with the main bundle identifier.
...
...
@@ -287,6 +288,64 @@ extension Keychain {
}
extension
Keychain
{
// MARK: Public Username
/// :nodoc:
public
func
set
(
publicUsername
:
String
)
throws
{
removePublicUsername
()
var
query
=
[
String
:
Any
]()
setScope
(
query
:
&
query
)
query
[
kSecClass
as
String
]
=
kSecClassGenericPassword
query
[
kSecAttrAccount
as
String
]
=
publicUsernameKey
query
[
kSecAttrAccessible
as
String
]
=
kSecAttrAccessibleAfterFirstUnlock
query
[
kSecValueData
as
String
]
=
publicUsername
.
data
(
using
:
.
utf8
)
let
status
=
SecItemAdd
(
query
as
CFDictionary
,
nil
)
guard
(
status
==
errSecSuccess
)
else
{
throw
KeychainError
.
add
}
}
/// :nodoc:
@discardableResult
public
func
removePublicUsername
()
->
Bool
{
var
query
=
[
String
:
Any
]()
setScope
(
query
:
&
query
)
query
[
kSecClass
as
String
]
=
kSecClassGenericPassword
query
[
kSecAttrAccount
as
String
]
=
publicUsernameKey
let
status
=
SecItemDelete
(
query
as
CFDictionary
)
return
(
status
==
errSecSuccess
)
}
/// :nodoc:
public
func
publicUsername
()
throws
->
String
{
var
query
=
[
String
:
Any
]()
setScope
(
query
:
&
query
)
query
[
kSecClass
as
String
]
=
kSecClassGenericPassword
query
[
kSecAttrAccount
as
String
]
=
publicUsernameKey
//query[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
query
[
kSecMatchLimit
as
String
]
=
kSecMatchLimitOne
query
[
kSecReturnData
as
String
]
=
true
var
result
:
AnyObject
?
let
status
=
SecItemCopyMatching
(
query
as
CFDictionary
,
&
result
)
guard
(
status
==
errSecSuccess
)
else
{
throw
KeychainError
.
notFound
}
guard
let
data
=
result
as?
Data
else
{
throw
KeychainError
.
notFound
}
guard
let
token
=
String
(
data
:
data
,
encoding
:
.
utf8
)
else
{
throw
KeychainError
.
notFound
}
return
token
}
}
extension
Keychain
{
// MARK: Token
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment