Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
f48f51ac
Commit
f48f51ac
authored
Feb 29, 2016
by
Phil Hughes
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Account settings
Closes #13854
parent
f7da99ae
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
200 additions
and
116 deletions
+200
-116
app/assets/javascripts/profile.js.coffee
app/assets/javascripts/profile.js.coffee
+4
-3
app/assets/stylesheets/framework/common.scss
app/assets/stylesheets/framework/common.scss
+3
-1
app/assets/stylesheets/framework/variables.scss
app/assets/stylesheets/framework/variables.scss
+2
-2
app/assets/stylesheets/pages/profile.scss
app/assets/stylesheets/pages/profile.scss
+44
-4
app/controllers/profiles/accounts_controller.rb
app/controllers/profiles/accounts_controller.rb
+24
-0
app/views/profiles/accounts/show.html.haml
app/views/profiles/accounts/show.html.haml
+123
-106
No files found.
app/assets/javascripts/profile.js.coffee
View file @
f48f51ac
...
...
@@ -4,12 +4,13 @@ class @Profile
$
(
'.js-preferences-form'
).
on
'change.preference'
,
'input[type=radio]'
,
->
$
(
this
).
parents
(
'form'
).
submit
()
$
(
'.update-username
form
'
).
on
'ajax:before'
,
->
$
(
'.loading-
gif
'
).
show
()
$
(
'.update-username'
).
on
'ajax:before'
,
->
$
(
'.loading-
username
'
).
show
()
$
(
this
).
find
(
'.update-success'
).
hide
()
$
(
this
).
find
(
'.update-failed'
).
hide
()
$
(
'.update-username form'
).
on
'ajax:complete'
,
->
$
(
'.update-username'
).
on
'ajax:complete'
,
->
$
(
'.loading-username'
).
hide
()
$
(
this
).
find
(
'.btn-save'
).
enable
()
$
(
this
).
find
(
'.loading-gif'
).
hide
()
...
...
app/assets/stylesheets/framework/common.scss
View file @
f48f51ac
...
...
@@ -12,11 +12,13 @@
.prepend-top-default
{
margin-top
:
$gl-padding
!
important
;
}
.prepend-top-20
{
margin-top
:
20px
}
.prepend-left-10
{
margin-left
:
10px
}
.prepend-left-default
{
margin-left
:
$gl-padding
}
.prepend-left-default
{
margin-left
:
$gl-padding
;
}
.prepend-left-20
{
margin-left
:
20px
}
.append-right-5
{
margin-right
:
5px
}
.append-right-10
{
margin-right
:
10px
}
.append-right-default
{
margin-right
:
$gl-padding
;
}
.append-right-20
{
margin-right
:
20px
}
.append-bottom-0
{
margin-bottom
:
0
}
.append-bottom-10
{
margin-bottom
:
10px
}
.append-bottom-15
{
margin-bottom
:
15px
}
.append-bottom-20
{
margin-bottom
:
20px
}
...
...
app/assets/stylesheets/framework/variables.scss
View file @
f48f51ac
...
...
@@ -70,7 +70,7 @@ $orange-light: rgba(252, 109, 38, 0.80);
$orange-normal
:
#E75E40
;
$orange-dark
:
#CE5237
;
$red-light
:
#F
43263
;
$red-light
:
#F
06559
;
$red-normal
:
#E52C5A
;
$red-dark
:
#D22852
;
...
...
@@ -94,7 +94,7 @@ $border-orange-light: #fc6d26;
$border-orange-normal
:
#CE5237
;
$border-orange-dark
:
#C14E35
;
$border-red-light
:
#
E52C5A
;
$border-red-light
:
#
F24F41
;
$border-red-normal
:
#D22852
;
$border-red-dark
:
#CA264F
;
...
...
app/assets/stylesheets/pages/profile.scss
View file @
f48f51ac
.account-page
{
fieldset
{
margin-bottom
:
15px
;
padding-bottom
:
15px
;
.profile-avatar-form-option
{
hr
{
margin
:
10px
0
;
}
}
...
...
@@ -175,3 +174,44 @@
color
:
$profile-settings-link-color
;
}
}
.change-username-title
{
color
:
#FC6D26
;
}
.remove-account-title
{
color
:
#F00
;
}
.provider-btn-group
{
display
:
inline-block
;
margin-right
:
10px
;
border
:
1px
solid
#E5E5E5
;
border-radius
:
3px
;
&
:last-child
{
margin-right
:
0
;
}
}
.provider-btn-image
{
display
:
inline-block
;
padding
:
5px
10px
;
border-right
:
1px
solid
#E5E5E5
;
>
img
{
width
:
20px
;
}
}
.provider-btn
{
display
:
inline-block
;
padding
:
5px
10px
;
margin-left
:
-3px
;
line-height
:
22px
;
background-color
:
$gray-light
;
&
.not-active
{
color
:
#4688F1
;
}
}
app/controllers/profiles/accounts_controller.rb
View file @
f48f51ac
class
Profiles::AccountsController
<
Profiles
::
ApplicationController
def
show
unless
current_user
.
otp_secret
current_user
.
otp_secret
=
User
.
generate_otp_secret
(
32
)
end
unless
current_user
.
otp_grace_period_started_at
&&
two_factor_grace_period
current_user
.
otp_grace_period_started_at
=
Time
.
current
end
current_user
.
save!
if
current_user
.
changed?
@user
=
current_user
@qr_code
=
build_qr_code
end
def
unlink
...
...
@@ -8,4 +20,16 @@ class Profiles::AccountsController < Profiles::ApplicationController
current_user
.
identities
.
find_by
(
provider:
provider
).
destroy
redirect_to
profile_account_path
end
private
def
build_qr_code
issuer
=
"
#{
issuer_host
}
|
#{
current_user
.
email
}
"
uri
=
current_user
.
otp_provisioning_uri
(
current_user
.
email
,
issuer:
issuer
)
RQRCode
::
render_qrcode
(
uri
,
:svg
,
level: :m
,
unit:
3
)
end
def
issuer_host
Gitlab
.
config
.
gitlab
.
host
end
end
app/views/profiles/accounts/show.html.haml
View file @
f48f51ac
...
...
@@ -5,114 +5,131 @@
.alert.alert-info
Some options are unavailable for LDAP accounts
.account-page.prepend-top-default
.panel.panel-default.update-token
.panel-heading
Reset Private token
.panel-body
=
form_for
@user
,
url:
reset_private_token_profile_path
,
method: :put
do
|
f
|
.data
%p
Your private token is used to access application resources without authentication.
%br
It can be used for atom feeds or the API.
%span
.cred
Keep it secret!
%p
.cgray
-
if
current_user
.
private_token
=
text_field_tag
"token"
,
current_user
.
private_token
,
class:
"form-control"
-
else
%span
You don`t have one yet. Click generate to fix it.
.form-actions
-
if
current_user
.
private_token
=
f
.
submit
'Reset private token'
,
data:
{
confirm:
"Are you sure?"
},
class:
"btn btn-default"
.row.prepend-top-default
.col-lg-3.profile-settings-sidebar
%h4
.prepend-top-0
Private Token
%p
Your private token is used to access application resources without authentication.
.col-lg-9
=
form_for
@user
,
url:
reset_private_token_profile_path
,
method: :put
do
|
f
|
%p
.cgray
-
if
current_user
.
private_token
=
label_tag
"token"
,
"Private token"
,
class:
"label-light"
=
text_field_tag
"token"
,
current_user
.
private_token
,
class:
"form-control"
-
else
%span
You don`t have one yet. Click generate to fix it.
%p
.help-block
It can be used for atom feeds or the API. Keep it secret!
.prepend-top-default
-
if
current_user
.
private_token
=
f
.
submit
'Reset private token'
,
data:
{
confirm:
"Are you sure?"
},
class:
"btn btn-default"
-
else
=
f
.
submit
'Generate'
,
class:
"btn btn-default"
%hr
.row.prepend-top-default
.col-lg-3.profile-settings-sidebar
%h4
.prepend-top-0
Two-factor Authentication
%p
Increase your account's security by enabling two-factor authentication (2FA).
.col-lg-9
%p
Status:
#{
current_user
.
two_factor_enabled?
?
'enabled'
:
'disabled'
}
-
if
!
current_user
.
two_factor_enabled?
%p
Download the Google Authenticator application from App Store for iOS or Google Play for Android and scan this code.
More information is available in the
#{
link_to
(
'documentation'
,
help_page_path
(
'profile'
,
'two_factor_authentication'
))
}
.
.row.append-bottom-10
.col-md-3
=
raw
@qr_code
.col-md-9
.account-well
%p
.prepend-top-0.append-bottom-0
Can't scan the code?
%p
.prepend-top-0.append-bottom-0
To add the entry manually, provide the following details to the application on your phone.
%p
.prepend-top-0.append-bottom-0
Account:
=
current_user
.
email
%p
.prepend-top-0.append-bottom-0
Key:
=
current_user
.
otp_secret
.
scan
(
/.{4}/
).
join
(
' '
)
%p
.two-factor-new-manual-content
Time based: Yes
=
form_for
@user
,
url:
""
,
method: :put
do
|
f
|
.form-group
=
label_tag
:pin_code
,
nil
,
class:
"label-light"
=
text_field_tag
:pin_code
,
nil
,
class:
"form-control"
,
required:
true
.prepend-top-default
=
submit_tag
'Enable two-factor authentication'
,
class:
'btn btn-success'
%hr
-
if
button_based_providers
.
any?
.row.prepend-top-default
.col-lg-3.profile-settings-sidebar
%h4
.prepend-top-0
Social sign-in
%p
Activate signin with one of the following services
.col-lg-9
%label
.label-light
Connected Accounts
%p
Click on icon to activate signin with one of the following services
-
button_based_providers
.
each
do
|
provider
|
.provider-btn-group
.provider-btn-image
=
provider_image_tag
(
provider
)
-
if
auth_active?
(
provider
)
=
link_to
unlink_profile_account_path
(
provider:
provider
),
method: :delete
,
class:
'provider-btn'
do
Disconnect
-
else
=
f
.
submit
'Generate'
,
class:
"btn btn-default"
=
link_to
user_omniauth_authorize_path
(
provider
),
method: :post
,
class:
"provider-btn
#{
'not-active'
if
!
auth_active?
(
provider
)
}
"
,
"data-no-turbolink"
=>
"true"
do
Connect
%hr
-
if
current_user
.
can_change_username?
.row.prepend-top-default
.col-lg-3.profile-settings-sidebar
%h4
.prepend-top-0.change-username-title
Change username
%p
Changing your username will change path to all personal projects!
.col-lg-9
=
form_for
@user
,
url:
update_username_profile_path
,
method: :put
,
remote:
true
,
html:
{
class:
"update-username"
}
do
|
f
|
.form-group
=
f
.
label
:username
,
"Path"
,
class:
"label-light"
.input-group
.input-group-addon
=
"
#{
root_url
}
u/"
=
f
.
text_field
:username
,
required:
true
,
class:
'form-control'
.help-block
Current path:
=
"
#{
root_url
}
u/
#{
current_user
.
username
}
"
.prepend-top-default
=
f
.
button
class:
"btn btn-warning"
,
type:
"submit"
do
=
icon
"spinner spin"
,
class:
"hidden loading-username"
Update username
%hr
.panel.panel-default
.panel-heading
Two-factor Authentication
.panel-body
-
if
current_user
.
two_factor_enabled?
.pull-right
=
link_to
'Disable Two-factor Authentication'
,
profile_two_factor_auth_path
,
method: :delete
,
class:
'btn btn-close btn-sm'
,
data:
{
confirm:
'Are you sure?'
}
%p
.text-success
%strong
Two-factor Authentication is enabled
-
if
signup_enabled?
.row.prepend-top-default
.col-lg-3.profile-settings-sidebar
%h4
.prepend-top-0.remove-account-title
Remove account
.col-lg-9
-
if
@user
.
can_be_removed?
%p
If you lose your recovery codes you can
%strong
=
succeed
','
do
=
link_to
'generate new ones'
,
codes_profile_two_factor_auth_path
,
method: :post
,
data:
{
confirm:
'Are you sure?'
}
invalidating all previous codes.
Deleting an account has the following effects:
%ul
%li
All user content like authored issues, snippets, comments will be removed
-
rp
=
current_user
.
personal_projects
.
count
-
unless
rp
.
zero?
%li
#{
pluralize
rp
,
'personal project'
}
will be removed and cannot be restored
=
link_to
'Delete account'
,
user_registration_path
,
data:
{
confirm:
"REMOVE
#{
current_user
.
name
}
? Are you sure?"
},
method: :delete
,
class:
"btn btn-remove"
-
else
%p
Increase your account's security by enabling two-factor authentication (2FA).
%p
Each time you log in you’ll be required to provide your username and
password as usual, plus a randomly-generated code from your phone.
.form-actions
=
link_to
'Enable Two-factor Authentication'
,
new_profile_two_factor_auth_path
,
class:
'btn btn-success'
-
if
button_based_providers
.
any?
.panel.panel-default
.panel-heading
Connected Accounts
.panel-body
.oauth-buttons.append-bottom-10
%p
Click on icon to activate signin with one of the following services
-
button_based_providers
.
each
do
|
provider
|
.btn-group
=
link_to
provider_image_tag
(
provider
),
user_omniauth_authorize_path
(
provider
),
method: :post
,
class:
"btn btn-lg
#{
'active'
if
auth_active?
(
provider
)
}
"
,
"data-no-turbolink"
=>
"true"
-
if
auth_active?
(
provider
)
=
link_to
unlink_profile_account_path
(
provider:
provider
),
method: :delete
,
class:
'btn btn-lg'
do
=
icon
(
'close'
)
-
if
current_user
.
can_change_username?
.panel.panel-warning.update-username
.panel-heading
Change Username
.panel-body
=
form_for
@user
,
url:
update_username_profile_path
,
method: :put
,
remote:
true
do
|
f
|
-
if
@user
.
solo_owned_groups
.
present?
%p
Changing your username will change path to all personal projects!
%div
.input-group
.input-group-addon
=
"
#{
root_url
}
u/"
=
f
.
text_field
:username
,
required:
true
,
class:
'form-control'
.loading-gif.hide
%p
=
icon
(
'spinner spin'
)
Saving new username
.form-actions
=
f
.
submit
'Save username'
,
class:
"btn btn-warning"
-
if
signup_enabled?
.panel.panel-danger.remove-account
.panel-heading
Remove account
.panel-body
-
if
@user
.
can_be_removed?
%p
Deleting an account has the following effects:
%ul
%li
All user content like authored issues, snippets, comments will be removed
-
rp
=
current_user
.
personal_projects
.
count
-
unless
rp
.
zero?
%li
#{
pluralize
rp
,
'personal project'
}
will be removed and cannot be restored
.form-actions
=
link_to
'Delete account'
,
user_registration_path
,
data:
{
confirm:
"REMOVE
#{
current_user
.
name
}
? Are you sure?"
},
method: :delete
,
class:
"btn btn-remove"
-
else
-
if
@user
.
solo_owned_groups
.
present?
%p
Your account is currently an owner in these groups:
%strong
#{
@user
.
solo_owned_groups
.
map
(
&
:name
).
join
(
', '
)
}
%p
You must transfer ownership or delete these groups before you can delete your account.
Your account is currently an owner in these groups:
%strong
#{
@user
.
solo_owned_groups
.
map
(
&
:name
).
join
(
', '
)
}
%p
You must transfer ownership or delete these groups before you can delete your account.
.append-bottom-default
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