Merge branch 'master' into blender-tweaks
This commit is contained in:
@@ -9,14 +9,14 @@ return array(
|
||||
'names' => array(
|
||||
'conpherence.pkg.css' => '3c8a0668',
|
||||
'conpherence.pkg.js' => '020aebcf',
|
||||
'core.pkg.css' => 'aa3df929',
|
||||
'core.pkg.js' => '5c737607',
|
||||
'differential.pkg.css' => 'b8df73d4',
|
||||
'differential.pkg.js' => '67c9ea4c',
|
||||
'core.pkg.css' => 'd81a600e',
|
||||
'core.pkg.js' => 'a747b035',
|
||||
'differential.pkg.css' => '8d8360fb',
|
||||
'differential.pkg.js' => '67e02996',
|
||||
'diffusion.pkg.css' => '42c75c37',
|
||||
'diffusion.pkg.js' => '91192d85',
|
||||
'diffusion.pkg.js' => 'a98c0bf7',
|
||||
'maniphest.pkg.css' => '35995d6d',
|
||||
'maniphest.pkg.js' => '286955ae',
|
||||
'maniphest.pkg.js' => 'c9308721',
|
||||
'rsrc/audio/basic/alert.mp3' => '17889334',
|
||||
'rsrc/audio/basic/bing.mp3' => 'a817a0c3',
|
||||
'rsrc/audio/basic/pock.mp3' => '0fa843d0',
|
||||
@@ -30,7 +30,7 @@ return array(
|
||||
'rsrc/css/aphront/notification.css' => '30240bd2',
|
||||
'rsrc/css/aphront/panel-view.css' => '46923d46',
|
||||
'rsrc/css/aphront/phabricator-nav-view.css' => 'f8a0c1bf',
|
||||
'rsrc/css/aphront/table-view.css' => '76eda3f8',
|
||||
'rsrc/css/aphront/table-view.css' => '7dc3a9c2',
|
||||
'rsrc/css/aphront/tokenizer.css' => 'b52d0668',
|
||||
'rsrc/css/aphront/tooltip.css' => 'e3f2412f',
|
||||
'rsrc/css/aphront/typeahead-browse.css' => 'b7ed02d2',
|
||||
@@ -38,7 +38,7 @@ return array(
|
||||
'rsrc/css/application/almanac/almanac.css' => '2e050f4f',
|
||||
'rsrc/css/application/auth/auth.css' => 'add92fd8',
|
||||
'rsrc/css/application/base/main-menu-view.css' => '69c1c2c1',
|
||||
'rsrc/css/application/base/notification-menu.css' => 'e6962e89',
|
||||
'rsrc/css/application/base/notification-menu.css' => '4df1ee30',
|
||||
'rsrc/css/application/base/phui-theme.css' => '35883b37',
|
||||
'rsrc/css/application/base/standard-page-view.css' => '8a295cb9',
|
||||
'rsrc/css/application/chatlog/chatlog.css' => 'abdc76ee',
|
||||
@@ -46,7 +46,7 @@ return array(
|
||||
'rsrc/css/application/config/config-options.css' => '16c920ae',
|
||||
'rsrc/css/application/config/config-template.css' => '20babf50',
|
||||
'rsrc/css/application/config/setup-issue.css' => '5eed85b2',
|
||||
'rsrc/css/application/config/unhandled-exception.css' => '9da8fdab',
|
||||
'rsrc/css/application/config/unhandled-exception.css' => '9ecfc00d',
|
||||
'rsrc/css/application/conpherence/color.css' => 'b17746b0',
|
||||
'rsrc/css/application/conpherence/durable-column.css' => '2d57072b',
|
||||
'rsrc/css/application/conpherence/header-pane.css' => 'c9a3db8e',
|
||||
@@ -61,8 +61,8 @@ return array(
|
||||
'rsrc/css/application/dashboard/dashboard.css' => '4267d6c6',
|
||||
'rsrc/css/application/diff/inline-comment-summary.css' => '81eb368d',
|
||||
'rsrc/css/application/differential/add-comment.css' => '7e5900d9',
|
||||
'rsrc/css/application/differential/changeset-view.css' => '73660575',
|
||||
'rsrc/css/application/differential/core.css' => 'bdb93065',
|
||||
'rsrc/css/application/differential/changeset-view.css' => 'bde53589',
|
||||
'rsrc/css/application/differential/core.css' => '7300a73e',
|
||||
'rsrc/css/application/differential/phui-inline-comment.css' => '48acce5b',
|
||||
'rsrc/css/application/differential/revision-comment.css' => '7dbc8d1d',
|
||||
'rsrc/css/application/differential/revision-history.css' => '8aa3eac5',
|
||||
@@ -99,7 +99,8 @@ return array(
|
||||
'rsrc/css/application/policy/policy-transaction-detail.css' => 'c02b8384',
|
||||
'rsrc/css/application/policy/policy.css' => 'ceb56a08',
|
||||
'rsrc/css/application/ponder/ponder-view.css' => '05a09d0a',
|
||||
'rsrc/css/application/project/project-card-view.css' => '3b1f7b20',
|
||||
'rsrc/css/application/project/project-card-view.css' => '4e7371cd',
|
||||
'rsrc/css/application/project/project-triggers.css' => 'cb866c2d',
|
||||
'rsrc/css/application/project/project-view.css' => '567858b3',
|
||||
'rsrc/css/application/releeph/releeph-core.css' => 'f81ff2db',
|
||||
'rsrc/css/application/releeph/releeph-preview-branch.css' => '22db5c07',
|
||||
@@ -112,7 +113,7 @@ return array(
|
||||
'rsrc/css/application/uiexample/example.css' => 'b4795059',
|
||||
'rsrc/css/core/core.css' => '1b29ed61',
|
||||
'rsrc/css/core/remarkup.css' => '9e627d41',
|
||||
'rsrc/css/core/syntax.css' => '8a16f91b',
|
||||
'rsrc/css/core/syntax.css' => '4234f572',
|
||||
'rsrc/css/core/z-index.css' => '99c0f5eb',
|
||||
'rsrc/css/diviner/diviner-shared.css' => '4bd263b0',
|
||||
'rsrc/css/font/font-awesome.css' => '3883938a',
|
||||
@@ -127,13 +128,13 @@ return array(
|
||||
'rsrc/css/phui/calendar/phui-calendar-list.css' => 'ccd7e4e2',
|
||||
'rsrc/css/phui/calendar/phui-calendar-month.css' => 'cb758c42',
|
||||
'rsrc/css/phui/calendar/phui-calendar.css' => 'f11073aa',
|
||||
'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '9e037c7a',
|
||||
'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '534f1757',
|
||||
'rsrc/css/phui/object-item/phui-oi-color.css' => 'b517bfa0',
|
||||
'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => 'da15d3dc',
|
||||
'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '490e2e2e',
|
||||
'rsrc/css/phui/object-item/phui-oi-list-view.css' => '909f3844',
|
||||
'rsrc/css/phui/object-item/phui-oi-list-view.css' => 'f14f2422',
|
||||
'rsrc/css/phui/object-item/phui-oi-simple-ui.css' => '6a30fa46',
|
||||
'rsrc/css/phui/phui-action-list.css' => 'c1a7631d',
|
||||
'rsrc/css/phui/phui-action-list.css' => 'c4972757',
|
||||
'rsrc/css/phui/phui-action-panel.css' => '6c386cbf',
|
||||
'rsrc/css/phui/phui-badge.css' => '666e25ad',
|
||||
'rsrc/css/phui/phui-basic-nav-view.css' => '56ebd66d',
|
||||
@@ -151,20 +152,20 @@ return array(
|
||||
'rsrc/css/phui/phui-document.css' => '52b748a5',
|
||||
'rsrc/css/phui/phui-feed-story.css' => 'a0c05029',
|
||||
'rsrc/css/phui/phui-fontkit.css' => '9b714a5e',
|
||||
'rsrc/css/phui/phui-form-view.css' => '81158a04',
|
||||
'rsrc/css/phui/phui-form-view.css' => 'a8e0a1ab',
|
||||
'rsrc/css/phui/phui-form.css' => '159e2d9c',
|
||||
'rsrc/css/phui/phui-head-thing.css' => 'd7f293df',
|
||||
'rsrc/css/phui/phui-header-view.css' => '93cea4ec',
|
||||
'rsrc/css/phui/phui-header-view.css' => '285c9139',
|
||||
'rsrc/css/phui/phui-hovercard.css' => '6ca90fa0',
|
||||
'rsrc/css/phui/phui-icon-set-selector.css' => '7aa5f3ec',
|
||||
'rsrc/css/phui/phui-icon.css' => '281f964d',
|
||||
'rsrc/css/phui/phui-icon.css' => '4cbc684a',
|
||||
'rsrc/css/phui/phui-image-mask.css' => '62c7f4d2',
|
||||
'rsrc/css/phui/phui-info-view.css' => '37b8d9ce',
|
||||
'rsrc/css/phui/phui-invisible-character-view.css' => 'c694c4a4',
|
||||
'rsrc/css/phui/phui-left-right.css' => '68513c34',
|
||||
'rsrc/css/phui/phui-lightbox.css' => '4ebf22da',
|
||||
'rsrc/css/phui/phui-list.css' => '470b1adb',
|
||||
'rsrc/css/phui/phui-object-box.css' => '9b58483d',
|
||||
'rsrc/css/phui/phui-object-box.css' => 'f434b6be',
|
||||
'rsrc/css/phui/phui-pager.css' => 'd022c7ad',
|
||||
'rsrc/css/phui/phui-pinboard-view.css' => '1f08f5d8',
|
||||
'rsrc/css/phui/phui-property-list-view.css' => 'cad62236',
|
||||
@@ -172,13 +173,13 @@ return array(
|
||||
'rsrc/css/phui/phui-segment-bar-view.css' => '5166b370',
|
||||
'rsrc/css/phui/phui-spacing.css' => 'b05cadc3',
|
||||
'rsrc/css/phui/phui-status.css' => 'e5ff8be0',
|
||||
'rsrc/css/phui/phui-tag-view.css' => 'a42fe34f',
|
||||
'rsrc/css/phui/phui-tag-view.css' => '29409667',
|
||||
'rsrc/css/phui/phui-timeline-view.css' => '1e348e4b',
|
||||
'rsrc/css/phui/phui-two-column-view.css' => '01e6991e',
|
||||
'rsrc/css/phui/workboards/phui-workboard-color.css' => 'e86de308',
|
||||
'rsrc/css/phui/workboards/phui-workboard.css' => '74fc9d98',
|
||||
'rsrc/css/phui/workboards/phui-workcard.css' => '8c536f90',
|
||||
'rsrc/css/phui/workboards/phui-workpanel.css' => 'bd546a49',
|
||||
'rsrc/css/phui/workboards/phui-workcard.css' => '9e9eb0df',
|
||||
'rsrc/css/phui/workboards/phui-workpanel.css' => '3ae89b20',
|
||||
'rsrc/css/sprite-login.css' => '18b368a6',
|
||||
'rsrc/css/sprite-tokens.css' => 'f1896dc5',
|
||||
'rsrc/css/syntax/syntax-default.css' => '055fc231',
|
||||
@@ -250,7 +251,7 @@ return array(
|
||||
'rsrc/externals/javelin/lib/Routable.js' => '6a18c42e',
|
||||
'rsrc/externals/javelin/lib/Router.js' => '32755edb',
|
||||
'rsrc/externals/javelin/lib/Scrollbar.js' => 'a43ae2ae',
|
||||
'rsrc/externals/javelin/lib/Sound.js' => 'e562708c',
|
||||
'rsrc/externals/javelin/lib/Sound.js' => 'd4cc2d2a',
|
||||
'rsrc/externals/javelin/lib/URI.js' => '2e255291',
|
||||
'rsrc/externals/javelin/lib/Vector.js' => 'e9c80beb',
|
||||
'rsrc/externals/javelin/lib/WebSocket.js' => 'fdc13e4e',
|
||||
@@ -277,6 +278,8 @@ return array(
|
||||
'rsrc/image/checker_dark.png' => '7fc8fa7b',
|
||||
'rsrc/image/checker_light.png' => '3157a202',
|
||||
'rsrc/image/checker_lighter.png' => 'c45928c1',
|
||||
'rsrc/image/chevron-in.png' => '1aa2f88f',
|
||||
'rsrc/image/chevron-out.png' => 'c815e272',
|
||||
'rsrc/image/controls/checkbox-checked.png' => '1770d7a0',
|
||||
'rsrc/image/controls/checkbox-unchecked.png' => 'e1deba0a',
|
||||
'rsrc/image/d5d8e1.png' => '6764616e',
|
||||
@@ -374,17 +377,16 @@ return array(
|
||||
'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '076bd092',
|
||||
'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '1e413dc9',
|
||||
'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => '9b1cbd76',
|
||||
'rsrc/js/application/diff/DiffChangeset.js' => 'e7cf10d6',
|
||||
'rsrc/js/application/diff/DiffChangesetList.js' => 'b91204e9',
|
||||
'rsrc/js/application/diff/DiffChangeset.js' => 'd0a85a85',
|
||||
'rsrc/js/application/diff/DiffChangesetList.js' => '04023d82',
|
||||
'rsrc/js/application/diff/DiffInline.js' => 'a4a14a94',
|
||||
'rsrc/js/application/diff/behavior-preview-link.js' => 'f51e9c17',
|
||||
'rsrc/js/application/differential/behavior-diff-radios.js' => '925fe8cd',
|
||||
'rsrc/js/application/differential/behavior-populate.js' => 'dfa1d313',
|
||||
'rsrc/js/application/differential/behavior-user-select.js' => 'e18685c0',
|
||||
'rsrc/js/application/diffusion/DiffusionLocateFileSource.js' => '94243d89',
|
||||
'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'b7b73831',
|
||||
'rsrc/js/application/diffusion/behavior-commit-branches.js' => '4b671572',
|
||||
'rsrc/js/application/diffusion/behavior-commit-graph.js' => '1c88f154',
|
||||
'rsrc/js/application/diffusion/behavior-commit-graph.js' => 'ef836bf2',
|
||||
'rsrc/js/application/diffusion/behavior-locate-file.js' => '87428eb2',
|
||||
'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => 'c715c123',
|
||||
'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => '6a85bc5a',
|
||||
@@ -396,10 +398,9 @@ return array(
|
||||
'rsrc/js/application/herald/HeraldRuleEditor.js' => '27daef73',
|
||||
'rsrc/js/application/herald/PathTypeahead.js' => 'ad486db3',
|
||||
'rsrc/js/application/herald/herald-rule-editor.js' => '0922e81d',
|
||||
'rsrc/js/application/maniphest/behavior-batch-selector.js' => 'cffd39b4',
|
||||
'rsrc/js/application/maniphest/behavior-batch-selector.js' => '139ef688',
|
||||
'rsrc/js/application/maniphest/behavior-line-chart.js' => 'c8147a20',
|
||||
'rsrc/js/application/maniphest/behavior-list-edit.js' => 'c687e867',
|
||||
'rsrc/js/application/maniphest/behavior-subpriorityeditor.js' => '8400307c',
|
||||
'rsrc/js/application/owners/OwnersPathEditor.js' => '2a8b62d9',
|
||||
'rsrc/js/application/owners/owners-path-editor.js' => 'ff688a7a',
|
||||
'rsrc/js/application/passphrase/passphrase-credential-control.js' => '48fe33d0',
|
||||
@@ -410,17 +411,22 @@ return array(
|
||||
'rsrc/js/application/phortune/phortune-credit-card-form.js' => 'd12d214f',
|
||||
'rsrc/js/application/policy/behavior-policy-control.js' => '0eaa33a9',
|
||||
'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '9347f172',
|
||||
'rsrc/js/application/projects/WorkboardBoard.js' => '45d0b2b1',
|
||||
'rsrc/js/application/projects/WorkboardCard.js' => '9a513421',
|
||||
'rsrc/js/application/projects/WorkboardColumn.js' => '8573dc1b',
|
||||
'rsrc/js/application/projects/WorkboardBoard.js' => 'c02a5497',
|
||||
'rsrc/js/application/projects/WorkboardCard.js' => '0392a5d8',
|
||||
'rsrc/js/application/projects/WorkboardCardTemplate.js' => '2a61f8d4',
|
||||
'rsrc/js/application/projects/WorkboardColumn.js' => 'c3d24e63',
|
||||
'rsrc/js/application/projects/WorkboardController.js' => '42c7a5a7',
|
||||
'rsrc/js/application/projects/behavior-project-boards.js' => '05c74d65',
|
||||
'rsrc/js/application/projects/WorkboardDropEffect.js' => '8e0aa661',
|
||||
'rsrc/js/application/projects/WorkboardHeader.js' => '111bfd2d',
|
||||
'rsrc/js/application/projects/WorkboardHeaderTemplate.js' => 'ebe83a6b',
|
||||
'rsrc/js/application/projects/WorkboardOrderTemplate.js' => '03e8891f',
|
||||
'rsrc/js/application/projects/behavior-project-boards.js' => 'aad45445',
|
||||
'rsrc/js/application/projects/behavior-project-create.js' => '34c53422',
|
||||
'rsrc/js/application/projects/behavior-reorder-columns.js' => '8ac32fd9',
|
||||
'rsrc/js/application/releeph/releeph-preview-branch.js' => '75184d68',
|
||||
'rsrc/js/application/releeph/releeph-request-state-change.js' => '9f081f05',
|
||||
'rsrc/js/application/releeph/releeph-request-typeahead.js' => 'aa3a100c',
|
||||
'rsrc/js/application/repository/repository-crossreference.js' => 'db0c0214',
|
||||
'rsrc/js/application/repository/repository-crossreference.js' => 'c15122b4',
|
||||
'rsrc/js/application/search/behavior-reorder-profile-menu-items.js' => 'e5bdb730',
|
||||
'rsrc/js/application/search/behavior-reorder-queries.js' => 'b86f297f',
|
||||
'rsrc/js/application/transactions/behavior-comment-actions.js' => '4dffaeb2',
|
||||
@@ -429,13 +435,18 @@ return array(
|
||||
'rsrc/js/application/transactions/behavior-show-older-transactions.js' => '600f440c',
|
||||
'rsrc/js/application/transactions/behavior-transaction-comment-form.js' => '2bdadf1a',
|
||||
'rsrc/js/application/transactions/behavior-transaction-list.js' => '9cec214e',
|
||||
'rsrc/js/application/trigger/TriggerRule.js' => '1c60c3fc',
|
||||
'rsrc/js/application/trigger/TriggerRuleControl.js' => '5faf27b9',
|
||||
'rsrc/js/application/trigger/TriggerRuleEditor.js' => 'b49fd60c',
|
||||
'rsrc/js/application/trigger/TriggerRuleType.js' => '4feea7d3',
|
||||
'rsrc/js/application/trigger/trigger-rule-editor.js' => '398fdf13',
|
||||
'rsrc/js/application/typeahead/behavior-typeahead-browse.js' => '70245195',
|
||||
'rsrc/js/application/typeahead/behavior-typeahead-search.js' => '7b139193',
|
||||
'rsrc/js/application/uiexample/gesture-example.js' => '242dedd0',
|
||||
'rsrc/js/application/uiexample/notification-example.js' => '29819b75',
|
||||
'rsrc/js/core/Busy.js' => '5202e831',
|
||||
'rsrc/js/core/DragAndDropFileUpload.js' => '4370900d',
|
||||
'rsrc/js/core/DraggableList.js' => '3c6bd549',
|
||||
'rsrc/js/core/DraggableList.js' => 'c9ad6f70',
|
||||
'rsrc/js/core/Favicon.js' => '7930776a',
|
||||
'rsrc/js/core/FileUpload.js' => 'ab85e184',
|
||||
'rsrc/js/core/Hovercard.js' => '074f0783',
|
||||
@@ -443,7 +454,7 @@ return array(
|
||||
'rsrc/js/core/KeyboardShortcutManager.js' => '37b8a04a',
|
||||
'rsrc/js/core/MultirowRowManager.js' => '5b54c823',
|
||||
'rsrc/js/core/Notification.js' => 'a9b91e3f',
|
||||
'rsrc/js/core/Prefab.js' => 'bf457520',
|
||||
'rsrc/js/core/Prefab.js' => '5793d835',
|
||||
'rsrc/js/core/ShapedRequest.js' => 'abf88db8',
|
||||
'rsrc/js/core/TextAreaUtils.js' => 'f340a484',
|
||||
'rsrc/js/core/Title.js' => '43bc9360',
|
||||
@@ -473,7 +484,7 @@ return array(
|
||||
'rsrc/js/core/behavior-linked-container.js' => '74446546',
|
||||
'rsrc/js/core/behavior-more.js' => '506aa3f4',
|
||||
'rsrc/js/core/behavior-object-selector.js' => 'a4af0b4a',
|
||||
'rsrc/js/core/behavior-oncopy.js' => '418f6684',
|
||||
'rsrc/js/core/behavior-oncopy.js' => 'ff7b3f22',
|
||||
'rsrc/js/core/behavior-phabricator-nav.js' => 'f166c949',
|
||||
'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '2f80333f',
|
||||
'rsrc/js/core/behavior-read-only-warning.js' => 'b9109f8f',
|
||||
@@ -489,7 +500,7 @@ return array(
|
||||
'rsrc/js/core/behavior-select-on-click.js' => '66365ee2',
|
||||
'rsrc/js/core/behavior-setup-check-https.js' => '01384686',
|
||||
'rsrc/js/core/behavior-time-typeahead.js' => '5803b9e7',
|
||||
'rsrc/js/core/behavior-toggle-class.js' => 'f5c78ae3',
|
||||
'rsrc/js/core/behavior-toggle-class.js' => '32db8374',
|
||||
'rsrc/js/core/behavior-tokenizer.js' => '3b4899b0',
|
||||
'rsrc/js/core/behavior-tooltip.js' => '73ecc1f8',
|
||||
'rsrc/js/core/behavior-user-menu.js' => '60cd9241',
|
||||
@@ -504,9 +515,10 @@ return array(
|
||||
'rsrc/js/phui/behavior-phui-selectable-list.js' => 'b26a41e4',
|
||||
'rsrc/js/phui/behavior-phui-submenu.js' => 'b5e9bff9',
|
||||
'rsrc/js/phui/behavior-phui-tab-group.js' => '242aa08b',
|
||||
'rsrc/js/phui/behavior-phui-timer-control.js' => 'f84bcbf4',
|
||||
'rsrc/js/phuix/PHUIXActionListView.js' => 'c68f183f',
|
||||
'rsrc/js/phuix/PHUIXActionView.js' => 'aaa08f3b',
|
||||
'rsrc/js/phuix/PHUIXAutocomplete.js' => '58cc4ab8',
|
||||
'rsrc/js/phuix/PHUIXAutocomplete.js' => '2fbe234d',
|
||||
'rsrc/js/phuix/PHUIXButtonView.js' => '55a24e84',
|
||||
'rsrc/js/phuix/PHUIXDropdownMenu.js' => 'bdce4d78',
|
||||
'rsrc/js/phuix/PHUIXExample.js' => 'c2c500a7',
|
||||
@@ -521,7 +533,7 @@ return array(
|
||||
'aphront-list-filter-view-css' => 'feb64255',
|
||||
'aphront-multi-column-view-css' => 'fbc00ba3',
|
||||
'aphront-panel-view-css' => '46923d46',
|
||||
'aphront-table-view-css' => '76eda3f8',
|
||||
'aphront-table-view-css' => '7dc3a9c2',
|
||||
'aphront-tokenizer-control-css' => 'b52d0668',
|
||||
'aphront-tooltip-css' => 'e3f2412f',
|
||||
'aphront-typeahead-control-css' => '8779483d',
|
||||
@@ -540,8 +552,8 @@ return array(
|
||||
'conpherence-thread-manager' => 'aec8e38c',
|
||||
'conpherence-transaction-css' => '3a3f5e7e',
|
||||
'd3' => 'd67475f5',
|
||||
'differential-changeset-view-css' => '73660575',
|
||||
'differential-core-view-css' => 'bdb93065',
|
||||
'differential-changeset-view-css' => 'bde53589',
|
||||
'differential-core-view-css' => '7300a73e',
|
||||
'differential-revision-add-comment-css' => '7e5900d9',
|
||||
'differential-revision-comment-css' => '7dbc8d1d',
|
||||
'differential-revision-history-css' => '8aa3eac5',
|
||||
@@ -595,9 +607,8 @@ return array(
|
||||
'javelin-behavior-diff-preview-link' => 'f51e9c17',
|
||||
'javelin-behavior-differential-diff-radios' => '925fe8cd',
|
||||
'javelin-behavior-differential-populate' => 'dfa1d313',
|
||||
'javelin-behavior-differential-user-select' => 'e18685c0',
|
||||
'javelin-behavior-diffusion-commit-branches' => '4b671572',
|
||||
'javelin-behavior-diffusion-commit-graph' => '1c88f154',
|
||||
'javelin-behavior-diffusion-commit-graph' => 'ef836bf2',
|
||||
'javelin-behavior-diffusion-locate-file' => '87428eb2',
|
||||
'javelin-behavior-diffusion-pull-lastmodified' => 'c715c123',
|
||||
'javelin-behavior-document-engine' => '243d6c22',
|
||||
@@ -618,9 +629,8 @@ return array(
|
||||
'javelin-behavior-lightbox-attachments' => 'c7e748bf',
|
||||
'javelin-behavior-line-chart' => 'c8147a20',
|
||||
'javelin-behavior-linked-container' => '74446546',
|
||||
'javelin-behavior-maniphest-batch-selector' => 'cffd39b4',
|
||||
'javelin-behavior-maniphest-batch-selector' => '139ef688',
|
||||
'javelin-behavior-maniphest-list-editor' => 'c687e867',
|
||||
'javelin-behavior-maniphest-subpriority-editor' => '8400307c',
|
||||
'javelin-behavior-owners-path-editor' => 'ff688a7a',
|
||||
'javelin-behavior-passphrase-credential-control' => '48fe33d0',
|
||||
'javelin-behavior-phabricator-active-nav' => '7353f43d',
|
||||
@@ -635,7 +645,7 @@ return array(
|
||||
'javelin-behavior-phabricator-nav' => 'f166c949',
|
||||
'javelin-behavior-phabricator-notification-example' => '29819b75',
|
||||
'javelin-behavior-phabricator-object-selector' => 'a4af0b4a',
|
||||
'javelin-behavior-phabricator-oncopy' => '418f6684',
|
||||
'javelin-behavior-phabricator-oncopy' => 'ff7b3f22',
|
||||
'javelin-behavior-phabricator-remarkup-assist' => '2f80333f',
|
||||
'javelin-behavior-phabricator-reveal-content' => 'b105a3a6',
|
||||
'javelin-behavior-phabricator-search-typeahead' => '1cb7d027',
|
||||
@@ -652,10 +662,11 @@ return array(
|
||||
'javelin-behavior-phui-selectable-list' => 'b26a41e4',
|
||||
'javelin-behavior-phui-submenu' => 'b5e9bff9',
|
||||
'javelin-behavior-phui-tab-group' => '242aa08b',
|
||||
'javelin-behavior-phui-timer-control' => 'f84bcbf4',
|
||||
'javelin-behavior-phuix-example' => 'c2c500a7',
|
||||
'javelin-behavior-policy-control' => '0eaa33a9',
|
||||
'javelin-behavior-policy-rule-editor' => '9347f172',
|
||||
'javelin-behavior-project-boards' => '05c74d65',
|
||||
'javelin-behavior-project-boards' => 'aad45445',
|
||||
'javelin-behavior-project-create' => '34c53422',
|
||||
'javelin-behavior-quicksand-blacklist' => '5a6f6a06',
|
||||
'javelin-behavior-read-only-warning' => 'b9109f8f',
|
||||
@@ -669,7 +680,7 @@ return array(
|
||||
'javelin-behavior-reorder-applications' => 'aa371860',
|
||||
'javelin-behavior-reorder-columns' => '8ac32fd9',
|
||||
'javelin-behavior-reorder-profile-menu-items' => 'e5bdb730',
|
||||
'javelin-behavior-repository-crossreference' => 'db0c0214',
|
||||
'javelin-behavior-repository-crossreference' => 'c15122b4',
|
||||
'javelin-behavior-scrollbar' => '92388bae',
|
||||
'javelin-behavior-search-reorder-queries' => 'b86f297f',
|
||||
'javelin-behavior-select-content' => 'e8240b50',
|
||||
@@ -678,8 +689,9 @@ return array(
|
||||
'javelin-behavior-stripe-payment-form' => '02cb4398',
|
||||
'javelin-behavior-test-payment-form' => '4a7fb02b',
|
||||
'javelin-behavior-time-typeahead' => '5803b9e7',
|
||||
'javelin-behavior-toggle-class' => 'f5c78ae3',
|
||||
'javelin-behavior-toggle-class' => '32db8374',
|
||||
'javelin-behavior-toggle-widget' => '8f959ad0',
|
||||
'javelin-behavior-trigger-rule-editor' => '398fdf13',
|
||||
'javelin-behavior-typeahead-browse' => '70245195',
|
||||
'javelin-behavior-typeahead-search' => '7b139193',
|
||||
'javelin-behavior-user-menu' => '60cd9241',
|
||||
@@ -708,7 +720,7 @@ return array(
|
||||
'javelin-routable' => '6a18c42e',
|
||||
'javelin-router' => '32755edb',
|
||||
'javelin-scrollbar' => 'a43ae2ae',
|
||||
'javelin-sound' => 'e562708c',
|
||||
'javelin-sound' => 'd4cc2d2a',
|
||||
'javelin-stratcom' => '0889b835',
|
||||
'javelin-tokenizer' => '89a1ae3a',
|
||||
'javelin-typeahead' => 'a4356cde',
|
||||
@@ -727,10 +739,15 @@ return array(
|
||||
'javelin-view-renderer' => '9aae2b66',
|
||||
'javelin-view-visitor' => '308f9fe4',
|
||||
'javelin-websocket' => 'fdc13e4e',
|
||||
'javelin-workboard-board' => '45d0b2b1',
|
||||
'javelin-workboard-card' => '9a513421',
|
||||
'javelin-workboard-column' => '8573dc1b',
|
||||
'javelin-workboard-board' => 'c02a5497',
|
||||
'javelin-workboard-card' => '0392a5d8',
|
||||
'javelin-workboard-card-template' => '2a61f8d4',
|
||||
'javelin-workboard-column' => 'c3d24e63',
|
||||
'javelin-workboard-controller' => '42c7a5a7',
|
||||
'javelin-workboard-drop-effect' => '8e0aa661',
|
||||
'javelin-workboard-header' => '111bfd2d',
|
||||
'javelin-workboard-header-template' => 'ebe83a6b',
|
||||
'javelin-workboard-order-template' => '03e8891f',
|
||||
'javelin-workflow' => '958e9045',
|
||||
'maniphest-report-css' => '3d53188b',
|
||||
'maniphest-task-edit-css' => '272daa84',
|
||||
@@ -742,7 +759,7 @@ return array(
|
||||
'path-typeahead' => 'ad486db3',
|
||||
'people-picture-menu-item-css' => 'fe8e07cf',
|
||||
'people-profile-css' => '2ea2daa1',
|
||||
'phabricator-action-list-view-css' => 'c1a7631d',
|
||||
'phabricator-action-list-view-css' => 'c4972757',
|
||||
'phabricator-busy' => '5202e831',
|
||||
'phabricator-chatlog-css' => 'abdc76ee',
|
||||
'phabricator-content-source-view-css' => 'cdf0d579',
|
||||
@@ -751,11 +768,11 @@ return array(
|
||||
'phabricator-darklog' => '3b869402',
|
||||
'phabricator-darkmessage' => '26cd4b73',
|
||||
'phabricator-dashboard-css' => '4267d6c6',
|
||||
'phabricator-diff-changeset' => 'e7cf10d6',
|
||||
'phabricator-diff-changeset-list' => 'b91204e9',
|
||||
'phabricator-diff-changeset' => 'd0a85a85',
|
||||
'phabricator-diff-changeset-list' => '04023d82',
|
||||
'phabricator-diff-inline' => 'a4a14a94',
|
||||
'phabricator-drag-and-drop-file-upload' => '4370900d',
|
||||
'phabricator-draggable-list' => '3c6bd549',
|
||||
'phabricator-draggable-list' => 'c9ad6f70',
|
||||
'phabricator-fatal-config-template-css' => '20babf50',
|
||||
'phabricator-favicon' => '7930776a',
|
||||
'phabricator-feed-css' => 'd8b6e3f8',
|
||||
@@ -768,10 +785,10 @@ return array(
|
||||
'phabricator-nav-view-css' => 'f8a0c1bf',
|
||||
'phabricator-notification' => 'a9b91e3f',
|
||||
'phabricator-notification-css' => '30240bd2',
|
||||
'phabricator-notification-menu-css' => 'e6962e89',
|
||||
'phabricator-notification-menu-css' => '4df1ee30',
|
||||
'phabricator-object-selector-css' => 'ee77366f',
|
||||
'phabricator-phtize' => '2f1db1ed',
|
||||
'phabricator-prefab' => 'bf457520',
|
||||
'phabricator-prefab' => '5793d835',
|
||||
'phabricator-remarkup-css' => '9e627d41',
|
||||
'phabricator-search-results-css' => '9ea70ace',
|
||||
'phabricator-shaped-request' => 'abf88db8',
|
||||
@@ -820,13 +837,13 @@ return array(
|
||||
'phui-font-icon-base-css' => 'd7994e06',
|
||||
'phui-fontkit-css' => '9b714a5e',
|
||||
'phui-form-css' => '159e2d9c',
|
||||
'phui-form-view-css' => '81158a04',
|
||||
'phui-form-view-css' => 'a8e0a1ab',
|
||||
'phui-head-thing-view-css' => 'd7f293df',
|
||||
'phui-header-view-css' => '93cea4ec',
|
||||
'phui-header-view-css' => '285c9139',
|
||||
'phui-hovercard' => '074f0783',
|
||||
'phui-hovercard-view-css' => '6ca90fa0',
|
||||
'phui-icon-set-selector-css' => '7aa5f3ec',
|
||||
'phui-icon-view-css' => '281f964d',
|
||||
'phui-icon-view-css' => '4cbc684a',
|
||||
'phui-image-mask-css' => '62c7f4d2',
|
||||
'phui-info-view-css' => '37b8d9ce',
|
||||
'phui-inline-comment-view-css' => '48acce5b',
|
||||
@@ -834,12 +851,12 @@ return array(
|
||||
'phui-left-right-css' => '68513c34',
|
||||
'phui-lightbox-css' => '4ebf22da',
|
||||
'phui-list-view-css' => '470b1adb',
|
||||
'phui-object-box-css' => '9b58483d',
|
||||
'phui-oi-big-ui-css' => '9e037c7a',
|
||||
'phui-object-box-css' => 'f434b6be',
|
||||
'phui-oi-big-ui-css' => '534f1757',
|
||||
'phui-oi-color-css' => 'b517bfa0',
|
||||
'phui-oi-drag-ui-css' => 'da15d3dc',
|
||||
'phui-oi-flush-ui-css' => '490e2e2e',
|
||||
'phui-oi-list-view-css' => '909f3844',
|
||||
'phui-oi-list-view-css' => 'f14f2422',
|
||||
'phui-oi-simple-ui-css' => '6a30fa46',
|
||||
'phui-pager-css' => 'd022c7ad',
|
||||
'phui-pinboard-view-css' => '1f08f5d8',
|
||||
@@ -848,17 +865,17 @@ return array(
|
||||
'phui-segment-bar-view-css' => '5166b370',
|
||||
'phui-spacing-css' => 'b05cadc3',
|
||||
'phui-status-list-view-css' => 'e5ff8be0',
|
||||
'phui-tag-view-css' => 'a42fe34f',
|
||||
'phui-tag-view-css' => '29409667',
|
||||
'phui-theme-css' => '35883b37',
|
||||
'phui-timeline-view-css' => '1e348e4b',
|
||||
'phui-two-column-view-css' => '01e6991e',
|
||||
'phui-workboard-color-css' => 'e86de308',
|
||||
'phui-workboard-view-css' => '74fc9d98',
|
||||
'phui-workcard-view-css' => '8c536f90',
|
||||
'phui-workpanel-view-css' => 'bd546a49',
|
||||
'phui-workcard-view-css' => '9e9eb0df',
|
||||
'phui-workpanel-view-css' => '3ae89b20',
|
||||
'phuix-action-list-view' => 'c68f183f',
|
||||
'phuix-action-view' => 'aaa08f3b',
|
||||
'phuix-autocomplete' => '58cc4ab8',
|
||||
'phuix-autocomplete' => '2fbe234d',
|
||||
'phuix-button-view' => '55a24e84',
|
||||
'phuix-dropdown-menu' => 'bdce4d78',
|
||||
'phuix-form-control-view' => '38c1f3fb',
|
||||
@@ -867,7 +884,8 @@ return array(
|
||||
'policy-edit-css' => '8794e2ed',
|
||||
'policy-transaction-detail-css' => 'c02b8384',
|
||||
'ponder-view-css' => '05a09d0a',
|
||||
'project-card-view-css' => '3b1f7b20',
|
||||
'project-card-view-css' => '4e7371cd',
|
||||
'project-triggers-css' => 'cb866c2d',
|
||||
'project-view-css' => '567858b3',
|
||||
'releeph-core' => 'f81ff2db',
|
||||
'releeph-preview-branch' => '22db5c07',
|
||||
@@ -877,10 +895,14 @@ return array(
|
||||
'sprite-login-css' => '18b368a6',
|
||||
'sprite-tokens-css' => 'f1896dc5',
|
||||
'syntax-default-css' => '055fc231',
|
||||
'syntax-highlighting-css' => '8a16f91b',
|
||||
'syntax-highlighting-css' => '4234f572',
|
||||
'tokens-css' => 'ce5a50bd',
|
||||
'trigger-rule' => '1c60c3fc',
|
||||
'trigger-rule-control' => '5faf27b9',
|
||||
'trigger-rule-editor' => 'b49fd60c',
|
||||
'trigger-rule-type' => '4feea7d3',
|
||||
'typeahead-browse-css' => 'b7ed02d2',
|
||||
'unhandled-exception-css' => '9da8fdab',
|
||||
'unhandled-exception-css' => '9ecfc00d',
|
||||
),
|
||||
'requires' => array(
|
||||
'01384686' => array(
|
||||
@@ -906,21 +928,22 @@ return array(
|
||||
'javelin-uri',
|
||||
'javelin-util',
|
||||
),
|
||||
'0392a5d8' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'03e8891f' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'04023d82' => array(
|
||||
'javelin-install',
|
||||
'phuix-button-view',
|
||||
),
|
||||
'04f8a1e3' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
'javelin-dom',
|
||||
'javelin-workflow',
|
||||
),
|
||||
'05c74d65' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-util',
|
||||
'javelin-vector',
|
||||
'javelin-stratcom',
|
||||
'javelin-workflow',
|
||||
'javelin-workboard-controller',
|
||||
),
|
||||
'05d290ef' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
@@ -995,19 +1018,23 @@ return array(
|
||||
'javelin-workflow',
|
||||
'phuix-icon-view',
|
||||
),
|
||||
'111bfd2d' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'1325b731' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-uri',
|
||||
'phabricator-keyboard-shortcut',
|
||||
),
|
||||
'1c850a26' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
),
|
||||
'1c88f154' => array(
|
||||
'139ef688' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-util',
|
||||
),
|
||||
'1c850a26' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
),
|
||||
'1cab0e9a' => array(
|
||||
'javelin-behavior',
|
||||
@@ -1104,6 +1131,9 @@ return array(
|
||||
'javelin-stratcom',
|
||||
'javelin-behavior',
|
||||
),
|
||||
'2a61f8d4' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'2a8b62d9' => array(
|
||||
'multirow-row-manager',
|
||||
'javelin-install',
|
||||
@@ -1146,6 +1176,12 @@ return array(
|
||||
'phuix-autocomplete',
|
||||
'javelin-mask',
|
||||
),
|
||||
'2fbe234d' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
'phuix-icon-view',
|
||||
'phabricator-prefab',
|
||||
),
|
||||
'308f9fe4' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
@@ -1154,6 +1190,11 @@ return array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
),
|
||||
'32db8374' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
'javelin-dom',
|
||||
),
|
||||
34450586 => array(
|
||||
'javelin-color',
|
||||
'javelin-install',
|
||||
@@ -1185,18 +1226,19 @@ return array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
),
|
||||
'398fdf13' => array(
|
||||
'javelin-behavior',
|
||||
'trigger-rule-editor',
|
||||
'trigger-rule',
|
||||
'trigger-rule-type',
|
||||
),
|
||||
'3ae89b20' => array(
|
||||
'phui-workcard-view-css',
|
||||
),
|
||||
'3b4899b0' => array(
|
||||
'javelin-behavior',
|
||||
'phabricator-prefab',
|
||||
),
|
||||
'3c6bd549' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-util',
|
||||
'javelin-vector',
|
||||
'javelin-magical-init',
|
||||
),
|
||||
'3dc5ad43' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
@@ -1217,9 +1259,8 @@ return array(
|
||||
'javelin-behavior',
|
||||
'javelin-uri',
|
||||
),
|
||||
'418f6684' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'4234f572' => array(
|
||||
'syntax-default-css',
|
||||
),
|
||||
'42c7a5a7' => array(
|
||||
'javelin-install',
|
||||
@@ -1251,15 +1292,6 @@ return array(
|
||||
'43bc9360' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'45d0b2b1' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
'javelin-util',
|
||||
'javelin-stratcom',
|
||||
'javelin-workflow',
|
||||
'phabricator-draggable-list',
|
||||
'javelin-workboard-column',
|
||||
),
|
||||
'46116c01' => array(
|
||||
'javelin-request',
|
||||
'javelin-behavior',
|
||||
@@ -1333,6 +1365,9 @@ return array(
|
||||
'javelin-sound',
|
||||
'phabricator-notification',
|
||||
),
|
||||
'4feea7d3' => array(
|
||||
'trigger-rule-control',
|
||||
),
|
||||
'506aa3f4' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
@@ -1343,6 +1378,9 @@ return array(
|
||||
'javelin-dom',
|
||||
'javelin-fx',
|
||||
),
|
||||
'534f1757' => array(
|
||||
'phui-oi-list-view-css',
|
||||
),
|
||||
'541f81c3' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
@@ -1355,6 +1393,18 @@ return array(
|
||||
'javelin-stratcom',
|
||||
'javelin-dom',
|
||||
),
|
||||
'5793d835' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
'javelin-dom',
|
||||
'javelin-typeahead',
|
||||
'javelin-tokenizer',
|
||||
'javelin-typeahead-preloaded-source',
|
||||
'javelin-typeahead-ondemand-source',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-util',
|
||||
),
|
||||
'5803b9e7' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-util',
|
||||
@@ -1363,12 +1413,6 @@ return array(
|
||||
'javelin-vector',
|
||||
'javelin-typeahead-static-source',
|
||||
),
|
||||
'58cc4ab8' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
'phuix-icon-view',
|
||||
'phabricator-prefab',
|
||||
),
|
||||
'5902260c' => array(
|
||||
'javelin-util',
|
||||
'javelin-magical-init',
|
||||
@@ -1409,6 +1453,9 @@ return array(
|
||||
'javelin-dom',
|
||||
'phuix-dropdown-menu',
|
||||
),
|
||||
'5faf27b9' => array(
|
||||
'phuix-form-control-view',
|
||||
),
|
||||
'600f440c' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
@@ -1488,9 +1535,6 @@ return array(
|
||||
'javelin-dom',
|
||||
'javelin-uri',
|
||||
),
|
||||
73660575 => array(
|
||||
'phui-inline-comment-view-css',
|
||||
),
|
||||
'73ecc1f8' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-behavior-device',
|
||||
@@ -1550,17 +1594,6 @@ return array(
|
||||
'javelin-dom',
|
||||
'javelin-vector',
|
||||
),
|
||||
'8400307c' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-workflow',
|
||||
'phabricator-draggable-list',
|
||||
),
|
||||
'8573dc1b' => array(
|
||||
'javelin-install',
|
||||
'javelin-workboard-card',
|
||||
),
|
||||
'87428eb2' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-diffusion-locate-file-source',
|
||||
@@ -1579,9 +1612,6 @@ return array(
|
||||
'javelin-stratcom',
|
||||
'javelin-install',
|
||||
),
|
||||
'8a16f91b' => array(
|
||||
'syntax-default-css',
|
||||
),
|
||||
'8ac32fd9' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
@@ -1609,6 +1639,10 @@ return array(
|
||||
'phabricator-shaped-request',
|
||||
'conpherence-thread-manager',
|
||||
),
|
||||
'8e0aa661' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
),
|
||||
'8f959ad0' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
@@ -1693,9 +1727,6 @@ return array(
|
||||
'javelin-dom',
|
||||
'javelin-router',
|
||||
),
|
||||
'9a513421' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'9aae2b66' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
@@ -1713,9 +1744,6 @@ return array(
|
||||
'javelin-uri',
|
||||
'phabricator-textareautils',
|
||||
),
|
||||
'9e037c7a' => array(
|
||||
'phui-oi-list-view-css',
|
||||
),
|
||||
'9f081f05' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
@@ -1801,6 +1829,16 @@ return array(
|
||||
'javelin-dom',
|
||||
'javelin-util',
|
||||
),
|
||||
'aad45445' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-util',
|
||||
'javelin-vector',
|
||||
'javelin-stratcom',
|
||||
'javelin-workflow',
|
||||
'javelin-workboard-controller',
|
||||
'javelin-workboard-drop-effect',
|
||||
),
|
||||
'ab85e184' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
@@ -1844,6 +1882,10 @@ return array(
|
||||
'b347a301' => array(
|
||||
'javelin-behavior',
|
||||
),
|
||||
'b49fd60c' => array(
|
||||
'multirow-row-manager',
|
||||
'trigger-rule',
|
||||
),
|
||||
'b517bfa0' => array(
|
||||
'phui-oi-list-view-css',
|
||||
),
|
||||
@@ -1882,13 +1924,6 @@ return array(
|
||||
'javelin-uri',
|
||||
'phabricator-notification',
|
||||
),
|
||||
'b91204e9' => array(
|
||||
'javelin-install',
|
||||
'phuix-button-view',
|
||||
),
|
||||
'bd546a49' => array(
|
||||
'phui-workcard-view-css',
|
||||
),
|
||||
'bdce4d78' => array(
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
@@ -1896,21 +1931,30 @@ return array(
|
||||
'javelin-vector',
|
||||
'javelin-stratcom',
|
||||
),
|
||||
'bf457520' => array(
|
||||
'bde53589' => array(
|
||||
'phui-inline-comment-view-css',
|
||||
),
|
||||
'c02a5497' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
'javelin-util',
|
||||
'javelin-dom',
|
||||
'javelin-typeahead',
|
||||
'javelin-tokenizer',
|
||||
'javelin-typeahead-preloaded-source',
|
||||
'javelin-typeahead-ondemand-source',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-util',
|
||||
'javelin-workflow',
|
||||
'phabricator-draggable-list',
|
||||
'javelin-workboard-column',
|
||||
'javelin-workboard-header-template',
|
||||
'javelin-workboard-card-template',
|
||||
'javelin-workboard-order-template',
|
||||
),
|
||||
'c03f2fb4' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'c15122b4' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-uri',
|
||||
),
|
||||
'c2c500a7' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
@@ -1922,6 +1966,11 @@ return array(
|
||||
'phabricator-phtize',
|
||||
'javelin-dom',
|
||||
),
|
||||
'c3d24e63' => array(
|
||||
'javelin-install',
|
||||
'javelin-workboard-card',
|
||||
'javelin-workboard-header',
|
||||
),
|
||||
'c687e867' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
@@ -1961,16 +2010,29 @@ return array(
|
||||
'javelin-util',
|
||||
'phabricator-keyboard-shortcut-manager',
|
||||
),
|
||||
'c9ad6f70' => array(
|
||||
'javelin-install',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-util',
|
||||
'javelin-vector',
|
||||
'javelin-magical-init',
|
||||
),
|
||||
'cf32921f' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
),
|
||||
'cffd39b4' => array(
|
||||
'javelin-behavior',
|
||||
'd0a85a85' => array(
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-util',
|
||||
'javelin-stratcom',
|
||||
'javelin-install',
|
||||
'javelin-workflow',
|
||||
'javelin-router',
|
||||
'javelin-behavior-device',
|
||||
'javelin-vector',
|
||||
'phabricator-diff-inline',
|
||||
),
|
||||
'd12d214f' => array(
|
||||
'javelin-install',
|
||||
@@ -1982,6 +2044,9 @@ return array(
|
||||
'd3799cb4' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'd4cc2d2a' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'd8a86cfb' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
@@ -1996,12 +2061,6 @@ return array(
|
||||
'javelin-uri',
|
||||
'phabricator-notification',
|
||||
),
|
||||
'db0c0214' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-uri',
|
||||
),
|
||||
'dfa1d313' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
@@ -2022,14 +2081,6 @@ return array(
|
||||
'javelin-dom',
|
||||
'javelin-history',
|
||||
),
|
||||
'e18685c0' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
),
|
||||
'e562708c' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'e5bdb730' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
@@ -2037,17 +2088,6 @@ return array(
|
||||
'javelin-dom',
|
||||
'phabricator-draggable-list',
|
||||
),
|
||||
'e7cf10d6' => array(
|
||||
'javelin-dom',
|
||||
'javelin-util',
|
||||
'javelin-stratcom',
|
||||
'javelin-install',
|
||||
'javelin-workflow',
|
||||
'javelin-router',
|
||||
'javelin-behavior-device',
|
||||
'javelin-vector',
|
||||
'phabricator-diff-inline',
|
||||
),
|
||||
'e8240b50' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
@@ -2068,6 +2108,9 @@ return array(
|
||||
'javelin-install',
|
||||
'javelin-event',
|
||||
),
|
||||
'ebe83a6b' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
'ec4e31c0' => array(
|
||||
'phui-timeline-view-css',
|
||||
),
|
||||
@@ -2079,6 +2122,11 @@ return array(
|
||||
'phabricator-keyboard-shortcut',
|
||||
'javelin-stratcom',
|
||||
),
|
||||
'ef836bf2' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
),
|
||||
'f166c949' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-behavior-device',
|
||||
@@ -2109,7 +2157,7 @@ return array(
|
||||
'javelin-stratcom',
|
||||
'javelin-dom',
|
||||
),
|
||||
'f5c78ae3' => array(
|
||||
'f84bcbf4' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
'javelin-dom',
|
||||
@@ -2141,6 +2189,10 @@ return array(
|
||||
'owners-path-editor',
|
||||
'javelin-behavior',
|
||||
),
|
||||
'ff7b3f22' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-dom',
|
||||
),
|
||||
),
|
||||
'packages' => array(
|
||||
'conpherence.pkg.css' => array(
|
||||
@@ -2333,7 +2385,6 @@ return array(
|
||||
'javelin-behavior-aphront-drag-and-drop-textarea',
|
||||
'javelin-behavior-phabricator-object-selector',
|
||||
'javelin-behavior-repository-crossreference',
|
||||
'javelin-behavior-differential-user-select',
|
||||
'javelin-behavior-aphront-more',
|
||||
'phabricator-diff-inline',
|
||||
'phabricator-diff-changeset',
|
||||
@@ -2352,7 +2403,6 @@ return array(
|
||||
),
|
||||
'maniphest.pkg.js' => array(
|
||||
'javelin-behavior-maniphest-batch-selector',
|
||||
'javelin-behavior-maniphest-subpriority-editor',
|
||||
'javelin-behavior-maniphest-list-editor',
|
||||
),
|
||||
),
|
||||
|
||||
@@ -199,7 +199,6 @@ return array(
|
||||
'javelin-behavior-phabricator-object-selector',
|
||||
'javelin-behavior-repository-crossreference',
|
||||
|
||||
'javelin-behavior-differential-user-select',
|
||||
'javelin-behavior-aphront-more',
|
||||
|
||||
'phabricator-diff-inline',
|
||||
@@ -219,7 +218,6 @@ return array(
|
||||
),
|
||||
'maniphest.pkg.js' => array(
|
||||
'javelin-behavior-maniphest-batch-selector',
|
||||
'javelin-behavior-maniphest-subpriority-editor',
|
||||
'javelin-behavior-maniphest-list-editor',
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new PhabricatorOwnersPackage();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $package) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$package->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new AlmanacDevice();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $device) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$device->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new AlmanacService();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $service) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$service->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new AlmanacNetwork();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $network) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$network->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new HarbormasterBuildPlan();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $plan) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$plan->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new DrydockBlueprint();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $blueprint) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$blueprint->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new NuanceSource();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $source) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$source->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new PhabricatorBadgesBadge();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $badge) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$badge->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new PhabricatorPhurlURL();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $url) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$url->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new ConpherenceThread();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $thread) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$thread->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,21 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table_db = new PhabricatorDashboard();
|
||||
|
||||
foreach (new LiskMigrationIterator($table_db) as $dashboard) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$dashboard->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
|
||||
$table_dbp = new PhabricatorDashboardPanel();
|
||||
|
||||
foreach (new LiskMigrationIterator($table_dbp) as $panel) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$panel->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new PhabricatorProject();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $project) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$project->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -1,11 +1,3 @@
|
||||
<?php
|
||||
|
||||
$table = new PonderQuestion();
|
||||
|
||||
foreach (new LiskMigrationIterator($table) as $question) {
|
||||
PhabricatorSearchWorker::queueDocumentForIndexing(
|
||||
$question->getPHID(),
|
||||
array(
|
||||
'force' => true,
|
||||
));
|
||||
}
|
||||
// This was an old reindexing migration that has been obsoleted. See T13253.
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
UPDATE {$NAMESPACE}_legalpad.legalpad_documentsignature
|
||||
SET signerPHID = NULL WHERE signerPHID LIKE 'PHID-XUSR-%';
|
||||
2
resources/sql/autopatches/20190206.external.02.email.sql
Normal file
2
resources/sql/autopatches/20190206.external.02.email.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
DELETE FROM {$NAMESPACE}_user.user_externalaccount
|
||||
WHERE accountType = 'email';
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_user.user_externalaccount
|
||||
ADD providerConfigPHID VARBINARY(64) NOT NULL;
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
$account_table = new PhabricatorExternalAccount();
|
||||
$account_conn = $account_table->establishConnection('w');
|
||||
$table_name = $account_table->getTableName();
|
||||
|
||||
$config_table = new PhabricatorAuthProviderConfig();
|
||||
$config_conn = $config_table->establishConnection('w');
|
||||
|
||||
foreach (new LiskRawMigrationIterator($account_conn, $table_name) as $row) {
|
||||
if (strlen($row['providerConfigPHID'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$config_row = queryfx_one(
|
||||
$config_conn,
|
||||
'SELECT phid
|
||||
FROM %R
|
||||
WHERE providerType = %s AND providerDomain = %s
|
||||
LIMIT 1',
|
||||
$config_table,
|
||||
$row['accountType'],
|
||||
$row['accountDomain']);
|
||||
if (!$config_row) {
|
||||
continue;
|
||||
}
|
||||
|
||||
queryfx(
|
||||
$account_conn,
|
||||
'UPDATE %R
|
||||
SET providerConfigPHID = %s
|
||||
WHERE id = %d',
|
||||
$account_table,
|
||||
$config_row['phid'],
|
||||
$row['id']);
|
||||
}
|
||||
2
resources/sql/autopatches/20190207.packages.01.state.sql
Normal file
2
resources/sql/autopatches/20190207.packages.01.state.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_owners.owners_package
|
||||
ADD auditingState VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT};
|
||||
@@ -0,0 +1,2 @@
|
||||
UPDATE {$NAMESPACE}_owners.owners_package
|
||||
SET auditingState = IF(auditingEnabled = 0, 'none', 'audit');
|
||||
2
resources/sql/autopatches/20190207.packages.03.drop.sql
Normal file
2
resources/sql/autopatches/20190207.packages.03.drop.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_owners.owners_package
|
||||
DROP auditingEnabled;
|
||||
41
resources/sql/autopatches/20190207.packages.04.xactions.php
Normal file
41
resources/sql/autopatches/20190207.packages.04.xactions.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
$table = new PhabricatorOwnersPackageTransaction();
|
||||
$conn = $table->establishConnection('w');
|
||||
$iterator = new LiskRawMigrationIterator($conn, $table->getTableName());
|
||||
|
||||
// Migrate "Auditing State" transactions for Owners Packages from old values
|
||||
// (which were "0" or "1", as JSON integer literals, without quotes) to new
|
||||
// values (which are JSON strings, with quotes).
|
||||
|
||||
foreach ($iterator as $row) {
|
||||
if ($row['transactionType'] !== 'owners.auditing') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$old_value = (int)$row['oldValue'];
|
||||
$new_value = (int)$row['newValue'];
|
||||
|
||||
if (!$old_value) {
|
||||
$old_value = 'none';
|
||||
} else {
|
||||
$old_value = 'audit';
|
||||
}
|
||||
|
||||
if (!$new_value) {
|
||||
$new_value = 'none';
|
||||
} else {
|
||||
$new_value = 'audit';
|
||||
}
|
||||
|
||||
$old_value = phutil_json_encode($old_value);
|
||||
$new_value = phutil_json_encode($new_value);
|
||||
|
||||
queryfx(
|
||||
$conn,
|
||||
'UPDATE %R SET oldValue = %s, newValue = %s WHERE id = %d',
|
||||
$table,
|
||||
$old_value,
|
||||
$new_value,
|
||||
$row['id']);
|
||||
}
|
||||
21
resources/sql/autopatches/20190215.daemons.01.dropdataid.php
Normal file
21
resources/sql/autopatches/20190215.daemons.01.dropdataid.php
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
// See T6615. We're about to change the nullability on the "dataID" column,
|
||||
// but it may have a UNIQUE KEY on it. Make sure we get rid of this key first
|
||||
// so we don't run into trouble.
|
||||
|
||||
// There's no "IF EXISTS" modifier for "ALTER TABLE" so run this as a PHP patch
|
||||
// instead of an SQL patch.
|
||||
|
||||
$table = new PhabricatorWorkerActiveTask();
|
||||
$conn = $table->establishConnection('w');
|
||||
|
||||
try {
|
||||
queryfx(
|
||||
$conn,
|
||||
'ALTER TABLE %R DROP KEY %T',
|
||||
$table,
|
||||
'dataID');
|
||||
} catch (AphrontQueryException $ex) {
|
||||
// Ignore.
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_worker.worker_activetask
|
||||
CHANGE dataID dataID INT UNSIGNED NOT NULL;
|
||||
@@ -0,0 +1,6 @@
|
||||
CREATE TABLE {$NAMESPACE}_harbormaster.harbormaster_string (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
stringIndex BINARY(12) NOT NULL,
|
||||
stringValue LONGTEXT NOT NULL,
|
||||
UNIQUE KEY `key_string` (stringIndex)
|
||||
) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildunitmessage
|
||||
ADD nameIndex BINARY(12) NOT NULL;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_worker.worker_archivetask
|
||||
ADD archivedEpoch INT UNSIGNED NULL;
|
||||
@@ -0,0 +1,3 @@
|
||||
ALTER TABLE {$NAMESPACE}_worker.worker_activetask
|
||||
ADD dateCreated int unsigned NOT NULL,
|
||||
ADD dateModified int unsigned NOT NULL;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_buildplan
|
||||
ADD properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT};
|
||||
@@ -0,0 +1,2 @@
|
||||
UPDATE {$NAMESPACE}_harbormaster.harbormaster_buildplan
|
||||
SET properties = '{}' WHERE properties = '';
|
||||
@@ -0,0 +1 @@
|
||||
DROP TABLE {$NAMESPACE}_herald.herald_ruletransaction_comment;
|
||||
@@ -0,0 +1,9 @@
|
||||
CREATE TABLE {$NAMESPACE}_project.project_trigger (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
phid VARBINARY(64) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT},
|
||||
editPolicy VARBINARY(64) NOT NULL,
|
||||
ruleset LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT},
|
||||
dateCreated INT UNSIGNED NOT NULL,
|
||||
dateModified INT UNSIGNED NOT NULL
|
||||
) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
|
||||
19
resources/sql/autopatches/20190312.triggers.02.xaction.sql
Normal file
19
resources/sql/autopatches/20190312.triggers.02.xaction.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
CREATE TABLE {$NAMESPACE}_project.project_triggertransaction (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
phid VARBINARY(64) NOT NULL,
|
||||
authorPHID VARBINARY(64) NOT NULL,
|
||||
objectPHID VARBINARY(64) NOT NULL,
|
||||
viewPolicy VARBINARY(64) NOT NULL,
|
||||
editPolicy VARBINARY(64) NOT NULL,
|
||||
commentPHID VARBINARY(64) DEFAULT NULL,
|
||||
commentVersion INT UNSIGNED NOT NULL,
|
||||
transactionType VARCHAR(32) NOT NULL,
|
||||
oldValue LONGTEXT NOT NULL,
|
||||
newValue LONGTEXT NOT NULL,
|
||||
contentSource LONGTEXT NOT NULL,
|
||||
metadata LONGTEXT NOT NULL,
|
||||
dateCreated INT UNSIGNED NOT NULL,
|
||||
dateModified INT UNSIGNED NOT NULL,
|
||||
UNIQUE KEY `key_phid` (`phid`),
|
||||
KEY `key_object` (`objectPHID`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT};
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE {$NAMESPACE}_project.project_column
|
||||
ADD triggerPHID VARBINARY(64);
|
||||
8
resources/sql/autopatches/20190322.triggers.01.usage.sql
Normal file
8
resources/sql/autopatches/20190322.triggers.01.usage.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
CREATE TABLE {$NAMESPACE}_project.project_triggerusage (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
triggerPHID VARBINARY(64) NOT NULL,
|
||||
examplePHID VARBINARY(64),
|
||||
columnCount INT UNSIGNED NOT NULL,
|
||||
activeColumnCount INT UNSIGNED NOT NULL,
|
||||
UNIQUE KEY `key_trigger` (triggerPHID)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT};
|
||||
11
resources/sql/autopatches/20190329.portals.01.create.sql
Normal file
11
resources/sql/autopatches/20190329.portals.01.create.sql
Normal file
@@ -0,0 +1,11 @@
|
||||
CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portal (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
phid VARBINARY(64) NOT NULL,
|
||||
name VARCHAR(255) NOT NULL COLLATE {$COLLATE_TEXT},
|
||||
status VARCHAR(32) NOT NULL COLLATE {$COLLATE_TEXT},
|
||||
viewPolicy VARBINARY(64) NOT NULL,
|
||||
editPolicy VARBINARY(64) NOT NULL,
|
||||
properties LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT},
|
||||
dateCreated INT UNSIGNED NOT NULL,
|
||||
dateModified INT UNSIGNED NOT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT};
|
||||
19
resources/sql/autopatches/20190329.portals.02.xaction.sql
Normal file
19
resources/sql/autopatches/20190329.portals.02.xaction.sql
Normal file
@@ -0,0 +1,19 @@
|
||||
CREATE TABLE {$NAMESPACE}_dashboard.dashboard_portaltransaction (
|
||||
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
phid VARBINARY(64) NOT NULL,
|
||||
authorPHID VARBINARY(64) NOT NULL,
|
||||
objectPHID VARBINARY(64) NOT NULL,
|
||||
viewPolicy VARBINARY(64) NOT NULL,
|
||||
editPolicy VARBINARY(64) NOT NULL,
|
||||
commentPHID VARBINARY(64) DEFAULT NULL,
|
||||
commentVersion INT UNSIGNED NOT NULL,
|
||||
transactionType VARCHAR(32) NOT NULL,
|
||||
oldValue LONGTEXT NOT NULL,
|
||||
newValue LONGTEXT NOT NULL,
|
||||
contentSource LONGTEXT NOT NULL,
|
||||
metadata LONGTEXT NOT NULL,
|
||||
dateCreated INT UNSIGNED NOT NULL,
|
||||
dateModified INT UNSIGNED NOT NULL,
|
||||
UNIQUE KEY `key_phid` (`phid`),
|
||||
KEY `key_object` (`objectPHID`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET={$CHARSET} COLLATE {$COLLATE_TEXT};
|
||||
@@ -1,2 +1,2 @@
|
||||
ALTER IGNORE TABLE `{$NAMESPACE}_file`.`file_imagemacro`
|
||||
ADD UNIQUE `name` (`name`);
|
||||
ALTER TABLE `{$NAMESPACE}_file`.`file_imagemacro`
|
||||
ADD UNIQUE KEY `name` (`name`);
|
||||
|
||||
@@ -1,66 +1,14 @@
|
||||
<?php
|
||||
|
||||
// NOTE: We aren't using PhabricatorUserOAuthInfo anywhere here because it is
|
||||
// getting nuked in a future diff.
|
||||
|
||||
$table = new PhabricatorUser();
|
||||
$conn = $table->establishConnection('w');
|
||||
$table_name = 'user_oauthinfo';
|
||||
$conn_w = $table->establishConnection('w');
|
||||
|
||||
$xaccount = new PhabricatorExternalAccount();
|
||||
|
||||
echo pht('Migrating OAuth to %s...', 'ExternalAccount')."\n";
|
||||
|
||||
$domain_map = array(
|
||||
'disqus' => 'disqus.com',
|
||||
'facebook' => 'facebook.com',
|
||||
'github' => 'github.com',
|
||||
'google' => 'google.com',
|
||||
);
|
||||
|
||||
try {
|
||||
$phabricator_oauth_uri = new PhutilURI(
|
||||
PhabricatorEnv::getEnvConfig('phabricator.oauth-uri'));
|
||||
$domain_map['phabricator'] = $phabricator_oauth_uri->getDomain();
|
||||
} catch (Exception $ex) {
|
||||
// Ignore; this likely indicates that we have removed `phabricator.oauth-uri`
|
||||
// in some future diff.
|
||||
foreach (new LiskRawMigrationIterator($conn, $table_name) as $row) {
|
||||
throw new Exception(
|
||||
pht(
|
||||
'Your Phabricator install has ancient OAuth account data and is '.
|
||||
'too old to upgrade directly to a modern version of Phabricator. '.
|
||||
'Upgrade to a version released between June 2013 and February 2019 '.
|
||||
'first, then upgrade to a modern version.'));
|
||||
}
|
||||
|
||||
$rows = queryfx_all(
|
||||
$conn_w,
|
||||
'SELECT * FROM user_oauthinfo');
|
||||
foreach ($rows as $row) {
|
||||
echo pht('Migrating row ID #%d.', $row['id'])."\n";
|
||||
$user = id(new PhabricatorUser())->loadOneWhere(
|
||||
'id = %d',
|
||||
$row['userID']);
|
||||
if (!$user) {
|
||||
echo pht('Bad user ID!')."\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
$domain = idx($domain_map, $row['oauthProvider']);
|
||||
if (empty($domain)) {
|
||||
echo pht('Unknown OAuth provider!')."\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
$xaccount = id(new PhabricatorExternalAccount())
|
||||
->setUserPHID($user->getPHID())
|
||||
->setAccountType($row['oauthProvider'])
|
||||
->setAccountDomain($domain)
|
||||
->setAccountID($row['oauthUID'])
|
||||
->setAccountURI($row['accountURI'])
|
||||
->setUsername($row['accountName'])
|
||||
->setDateCreated($row['dateCreated']);
|
||||
|
||||
try {
|
||||
$xaccount->save();
|
||||
} catch (Exception $ex) {
|
||||
phlog($ex);
|
||||
}
|
||||
}
|
||||
|
||||
echo pht('Done.')."\n";
|
||||
|
||||
@@ -1,41 +1,14 @@
|
||||
<?php
|
||||
|
||||
// NOTE: We aren't using PhabricatorUserLDAPInfo anywhere here because it is
|
||||
// being nuked by this change
|
||||
|
||||
$table = new PhabricatorUser();
|
||||
$conn = $table->establishConnection('w');
|
||||
$table_name = 'user_ldapinfo';
|
||||
$conn_w = $table->establishConnection('w');
|
||||
|
||||
$xaccount = new PhabricatorExternalAccount();
|
||||
|
||||
echo pht('Migrating LDAP to %s...', 'ExternalAccount')."\n";
|
||||
|
||||
$rows = queryfx_all($conn_w, 'SELECT * FROM %T', $table_name);
|
||||
foreach ($rows as $row) {
|
||||
echo pht('Migrating row ID #%d.', $row['id'])."\n";
|
||||
$user = id(new PhabricatorUser())->loadOneWhere(
|
||||
'id = %d',
|
||||
$row['userID']);
|
||||
if (!$user) {
|
||||
echo pht('Bad user ID!')."\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
$xaccount = id(new PhabricatorExternalAccount())
|
||||
->setUserPHID($user->getPHID())
|
||||
->setAccountType('ldap')
|
||||
->setAccountDomain('self')
|
||||
->setAccountID($row['ldapUsername'])
|
||||
->setUsername($row['ldapUsername'])
|
||||
->setDateCreated($row['dateCreated']);
|
||||
|
||||
try {
|
||||
$xaccount->save();
|
||||
} catch (Exception $ex) {
|
||||
phlog($ex);
|
||||
}
|
||||
foreach (new LiskRawMigrationIterator($conn, $table_name) as $row) {
|
||||
throw new Exception(
|
||||
pht(
|
||||
'Your Phabricator install has ancient LDAP account data and is '.
|
||||
'too old to upgrade directly to a modern version of Phabricator. '.
|
||||
'Upgrade to a version released between June 2013 and February 2019 '.
|
||||
'first, then upgrade to a modern version.'));
|
||||
}
|
||||
|
||||
echo pht('Done.')."\n";
|
||||
|
||||
@@ -653,6 +653,7 @@ phutil_register_library_map(array(
|
||||
'DifferentialRevisionUpdateTransaction' => 'applications/differential/xaction/DifferentialRevisionUpdateTransaction.php',
|
||||
'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.php',
|
||||
'DifferentialRevisionVoidTransaction' => 'applications/differential/xaction/DifferentialRevisionVoidTransaction.php',
|
||||
'DifferentialRevisionWrongBuildsTransaction' => 'applications/differential/xaction/DifferentialRevisionWrongBuildsTransaction.php',
|
||||
'DifferentialRevisionWrongStateTransaction' => 'applications/differential/xaction/DifferentialRevisionWrongStateTransaction.php',
|
||||
'DifferentialSchemaSpec' => 'applications/differential/storage/DifferentialSchemaSpec.php',
|
||||
'DifferentialSetDiffPropertyConduitAPIMethod' => 'applications/differential/conduit/DifferentialSetDiffPropertyConduitAPIMethod.php',
|
||||
@@ -1328,18 +1329,26 @@ phutil_register_library_map(array(
|
||||
'HarbormasterBuildMessageQuery' => 'applications/harbormaster/query/HarbormasterBuildMessageQuery.php',
|
||||
'HarbormasterBuildPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPHIDType.php',
|
||||
'HarbormasterBuildPlan' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php',
|
||||
'HarbormasterBuildPlanBehavior' => 'applications/harbormaster/plan/HarbormasterBuildPlanBehavior.php',
|
||||
'HarbormasterBuildPlanBehaviorOption' => 'applications/harbormaster/plan/HarbormasterBuildPlanBehaviorOption.php',
|
||||
'HarbormasterBuildPlanBehaviorTransaction' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanBehaviorTransaction.php',
|
||||
'HarbormasterBuildPlanDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildPlanDatasource.php',
|
||||
'HarbormasterBuildPlanDefaultEditCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultEditCapability.php',
|
||||
'HarbormasterBuildPlanDefaultViewCapability' => 'applications/harbormaster/capability/HarbormasterBuildPlanDefaultViewCapability.php',
|
||||
'HarbormasterBuildPlanEditAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildPlanEditAPIMethod.php',
|
||||
'HarbormasterBuildPlanEditEngine' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditEngine.php',
|
||||
'HarbormasterBuildPlanEditor' => 'applications/harbormaster/editor/HarbormasterBuildPlanEditor.php',
|
||||
'HarbormasterBuildPlanNameNgrams' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanNameNgrams.php',
|
||||
'HarbormasterBuildPlanNameTransaction' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanNameTransaction.php',
|
||||
'HarbormasterBuildPlanPHIDType' => 'applications/harbormaster/phid/HarbormasterBuildPlanPHIDType.php',
|
||||
'HarbormasterBuildPlanPolicyCodex' => 'applications/harbormaster/codex/HarbormasterBuildPlanPolicyCodex.php',
|
||||
'HarbormasterBuildPlanQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanQuery.php',
|
||||
'HarbormasterBuildPlanSearchAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildPlanSearchAPIMethod.php',
|
||||
'HarbormasterBuildPlanSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php',
|
||||
'HarbormasterBuildPlanStatusTransaction' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanStatusTransaction.php',
|
||||
'HarbormasterBuildPlanTransaction' => 'applications/harbormaster/storage/configuration/HarbormasterBuildPlanTransaction.php',
|
||||
'HarbormasterBuildPlanTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildPlanTransactionQuery.php',
|
||||
'HarbormasterBuildPlanTransactionType' => 'applications/harbormaster/xaction/plan/HarbormasterBuildPlanTransactionType.php',
|
||||
'HarbormasterBuildQuery' => 'applications/harbormaster/query/HarbormasterBuildQuery.php',
|
||||
'HarbormasterBuildRequest' => 'applications/harbormaster/engine/HarbormasterBuildRequest.php',
|
||||
'HarbormasterBuildSearchConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterBuildSearchConduitAPIMethod.php',
|
||||
@@ -1365,6 +1374,8 @@ phutil_register_library_map(array(
|
||||
'HarbormasterBuildTransactionEditor' => 'applications/harbormaster/editor/HarbormasterBuildTransactionEditor.php',
|
||||
'HarbormasterBuildTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildTransactionQuery.php',
|
||||
'HarbormasterBuildUnitMessage' => 'applications/harbormaster/storage/build/HarbormasterBuildUnitMessage.php',
|
||||
'HarbormasterBuildUnitMessageQuery' => 'applications/harbormaster/query/HarbormasterBuildUnitMessageQuery.php',
|
||||
'HarbormasterBuildView' => 'applications/harbormaster/view/HarbormasterBuildView.php',
|
||||
'HarbormasterBuildViewController' => 'applications/harbormaster/controller/HarbormasterBuildViewController.php',
|
||||
'HarbormasterBuildWorker' => 'applications/harbormaster/worker/HarbormasterBuildWorker.php',
|
||||
'HarbormasterBuildable' => 'applications/harbormaster/storage/HarbormasterBuildable.php',
|
||||
@@ -1418,6 +1429,7 @@ phutil_register_library_map(array(
|
||||
'HarbormasterMessageType' => 'applications/harbormaster/engine/HarbormasterMessageType.php',
|
||||
'HarbormasterObject' => 'applications/harbormaster/storage/HarbormasterObject.php',
|
||||
'HarbormasterOtherBuildStepGroup' => 'applications/harbormaster/stepgroup/HarbormasterOtherBuildStepGroup.php',
|
||||
'HarbormasterPlanBehaviorController' => 'applications/harbormaster/controller/HarbormasterPlanBehaviorController.php',
|
||||
'HarbormasterPlanController' => 'applications/harbormaster/controller/HarbormasterPlanController.php',
|
||||
'HarbormasterPlanDisableController' => 'applications/harbormaster/controller/HarbormasterPlanDisableController.php',
|
||||
'HarbormasterPlanEditController' => 'applications/harbormaster/controller/HarbormasterPlanEditController.php',
|
||||
@@ -1431,6 +1443,7 @@ phutil_register_library_map(array(
|
||||
'HarbormasterQueryBuildsConduitAPIMethod' => 'applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php',
|
||||
'HarbormasterQueryBuildsSearchEngineAttachment' => 'applications/harbormaster/engineextension/HarbormasterQueryBuildsSearchEngineAttachment.php',
|
||||
'HarbormasterRemarkupRule' => 'applications/harbormaster/remarkup/HarbormasterRemarkupRule.php',
|
||||
'HarbormasterRestartException' => 'applications/harbormaster/exception/HarbormasterRestartException.php',
|
||||
'HarbormasterRunBuildPlansHeraldAction' => 'applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php',
|
||||
'HarbormasterSchemaSpec' => 'applications/harbormaster/storage/HarbormasterSchemaSpec.php',
|
||||
'HarbormasterScratchTable' => 'applications/harbormaster/storage/HarbormasterScratchTable.php',
|
||||
@@ -1440,6 +1453,7 @@ phutil_register_library_map(array(
|
||||
'HarbormasterStepDeleteController' => 'applications/harbormaster/controller/HarbormasterStepDeleteController.php',
|
||||
'HarbormasterStepEditController' => 'applications/harbormaster/controller/HarbormasterStepEditController.php',
|
||||
'HarbormasterStepViewController' => 'applications/harbormaster/controller/HarbormasterStepViewController.php',
|
||||
'HarbormasterString' => 'applications/harbormaster/storage/HarbormasterString.php',
|
||||
'HarbormasterTargetEngine' => 'applications/harbormaster/engine/HarbormasterTargetEngine.php',
|
||||
'HarbormasterTargetSearchAPIMethod' => 'applications/harbormaster/conduit/HarbormasterTargetSearchAPIMethod.php',
|
||||
'HarbormasterTargetWorker' => 'applications/harbormaster/worker/HarbormasterTargetWorker.php',
|
||||
@@ -1518,14 +1532,20 @@ phutil_register_library_map(array(
|
||||
'HeraldRemarkupFieldValue' => 'applications/herald/value/HeraldRemarkupFieldValue.php',
|
||||
'HeraldRemarkupRule' => 'applications/herald/remarkup/HeraldRemarkupRule.php',
|
||||
'HeraldRule' => 'applications/herald/storage/HeraldRule.php',
|
||||
'HeraldRuleActionAffectsObjectEdgeType' => 'applications/herald/edge/HeraldRuleActionAffectsObjectEdgeType.php',
|
||||
'HeraldRuleAdapter' => 'applications/herald/adapter/HeraldRuleAdapter.php',
|
||||
'HeraldRuleAdapterField' => 'applications/herald/field/rule/HeraldRuleAdapterField.php',
|
||||
'HeraldRuleController' => 'applications/herald/controller/HeraldRuleController.php',
|
||||
'HeraldRuleDatasource' => 'applications/herald/typeahead/HeraldRuleDatasource.php',
|
||||
'HeraldRuleDisableTransaction' => 'applications/herald/xaction/HeraldRuleDisableTransaction.php',
|
||||
'HeraldRuleEditTransaction' => 'applications/herald/xaction/HeraldRuleEditTransaction.php',
|
||||
'HeraldRuleEditor' => 'applications/herald/editor/HeraldRuleEditor.php',
|
||||
'HeraldRuleField' => 'applications/herald/field/rule/HeraldRuleField.php',
|
||||
'HeraldRuleFieldGroup' => 'applications/herald/field/rule/HeraldRuleFieldGroup.php',
|
||||
'HeraldRuleIndexEngineExtension' => 'applications/herald/engineextension/HeraldRuleIndexEngineExtension.php',
|
||||
'HeraldRuleListController' => 'applications/herald/controller/HeraldRuleListController.php',
|
||||
'HeraldRuleListView' => 'applications/herald/view/HeraldRuleListView.php',
|
||||
'HeraldRuleNameTransaction' => 'applications/herald/xaction/HeraldRuleNameTransaction.php',
|
||||
'HeraldRulePHIDType' => 'applications/herald/phid/HeraldRulePHIDType.php',
|
||||
'HeraldRuleQuery' => 'applications/herald/query/HeraldRuleQuery.php',
|
||||
'HeraldRuleReplyHandler' => 'applications/herald/mail/HeraldRuleReplyHandler.php',
|
||||
@@ -1533,7 +1553,7 @@ phutil_register_library_map(array(
|
||||
'HeraldRuleSerializer' => 'applications/herald/editor/HeraldRuleSerializer.php',
|
||||
'HeraldRuleTestCase' => 'applications/herald/storage/__tests__/HeraldRuleTestCase.php',
|
||||
'HeraldRuleTransaction' => 'applications/herald/storage/HeraldRuleTransaction.php',
|
||||
'HeraldRuleTransactionComment' => 'applications/herald/storage/HeraldRuleTransactionComment.php',
|
||||
'HeraldRuleTransactionType' => 'applications/herald/xaction/HeraldRuleTransactionType.php',
|
||||
'HeraldRuleTranscript' => 'applications/herald/storage/transcript/HeraldRuleTranscript.php',
|
||||
'HeraldRuleTypeConfig' => 'applications/herald/config/HeraldRuleTypeConfig.php',
|
||||
'HeraldRuleTypeDatasource' => 'applications/herald/typeahead/HeraldRuleTypeDatasource.php',
|
||||
@@ -1690,7 +1710,6 @@ phutil_register_library_map(array(
|
||||
'ManiphestStatusEmailCommand' => 'applications/maniphest/command/ManiphestStatusEmailCommand.php',
|
||||
'ManiphestStatusSearchConduitAPIMethod' => 'applications/maniphest/conduit/ManiphestStatusSearchConduitAPIMethod.php',
|
||||
'ManiphestStatusesConfigType' => 'applications/maniphest/config/ManiphestStatusesConfigType.php',
|
||||
'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php',
|
||||
'ManiphestSubtypesConfigType' => 'applications/maniphest/config/ManiphestSubtypesConfigType.php',
|
||||
'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php',
|
||||
'ManiphestTaskAssignHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignHeraldAction.php',
|
||||
@@ -1715,6 +1734,7 @@ phutil_register_library_map(array(
|
||||
'ManiphestTaskFerretEngine' => 'applications/maniphest/search/ManiphestTaskFerretEngine.php',
|
||||
'ManiphestTaskFulltextEngine' => 'applications/maniphest/search/ManiphestTaskFulltextEngine.php',
|
||||
'ManiphestTaskGraph' => 'infrastructure/graph/ManiphestTaskGraph.php',
|
||||
'ManiphestTaskGraphController' => 'applications/maniphest/controller/ManiphestTaskGraphController.php',
|
||||
'ManiphestTaskHasCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasCommitEdgeType.php',
|
||||
'ManiphestTaskHasCommitRelationship' => 'applications/maniphest/relationship/ManiphestTaskHasCommitRelationship.php',
|
||||
'ManiphestTaskHasDuplicateTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskHasDuplicateTaskEdgeType.php',
|
||||
@@ -1742,6 +1762,7 @@ phutil_register_library_map(array(
|
||||
'ManiphestTaskParentTransaction' => 'applications/maniphest/xaction/ManiphestTaskParentTransaction.php',
|
||||
'ManiphestTaskPoints' => 'applications/maniphest/constants/ManiphestTaskPoints.php',
|
||||
'ManiphestTaskPointsTransaction' => 'applications/maniphest/xaction/ManiphestTaskPointsTransaction.php',
|
||||
'ManiphestTaskPolicyCodex' => 'applications/maniphest/policy/ManiphestTaskPolicyCodex.php',
|
||||
'ManiphestTaskPriority' => 'applications/maniphest/constants/ManiphestTaskPriority.php',
|
||||
'ManiphestTaskPriorityDatasource' => 'applications/maniphest/typeahead/ManiphestTaskPriorityDatasource.php',
|
||||
'ManiphestTaskPriorityHeraldAction' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldAction.php',
|
||||
@@ -1762,11 +1783,11 @@ phutil_register_library_map(array(
|
||||
'ManiphestTaskSubpriorityTransaction' => 'applications/maniphest/xaction/ManiphestTaskSubpriorityTransaction.php',
|
||||
'ManiphestTaskSubtaskController' => 'applications/maniphest/controller/ManiphestTaskSubtaskController.php',
|
||||
'ManiphestTaskSubtypeDatasource' => 'applications/maniphest/typeahead/ManiphestTaskSubtypeDatasource.php',
|
||||
'ManiphestTaskTestCase' => 'applications/maniphest/__tests__/ManiphestTaskTestCase.php',
|
||||
'ManiphestTaskTitleHeraldField' => 'applications/maniphest/herald/ManiphestTaskTitleHeraldField.php',
|
||||
'ManiphestTaskTitleTransaction' => 'applications/maniphest/xaction/ManiphestTaskTitleTransaction.php',
|
||||
'ManiphestTaskTransactionType' => 'applications/maniphest/xaction/ManiphestTaskTransactionType.php',
|
||||
'ManiphestTaskUnblockTransaction' => 'applications/maniphest/xaction/ManiphestTaskUnblockTransaction.php',
|
||||
'ManiphestTaskUnlockEngine' => 'applications/maniphest/engine/ManiphestTaskUnlockEngine.php',
|
||||
'ManiphestTransaction' => 'applications/maniphest/storage/ManiphestTransaction.php',
|
||||
'ManiphestTransactionComment' => 'applications/maniphest/storage/ManiphestTransactionComment.php',
|
||||
'ManiphestTransactionEditor' => 'applications/maniphest/editor/ManiphestTransactionEditor.php',
|
||||
@@ -2198,6 +2219,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthChallengeGarbageCollector' => 'applications/auth/garbagecollector/PhabricatorAuthChallengeGarbageCollector.php',
|
||||
'PhabricatorAuthChallengePHIDType' => 'applications/auth/phid/PhabricatorAuthChallengePHIDType.php',
|
||||
'PhabricatorAuthChallengeQuery' => 'applications/auth/query/PhabricatorAuthChallengeQuery.php',
|
||||
'PhabricatorAuthChallengeStatusController' => 'applications/auth/controller/mfa/PhabricatorAuthChallengeStatusController.php',
|
||||
'PhabricatorAuthChallengeUpdate' => 'applications/auth/view/PhabricatorAuthChallengeUpdate.php',
|
||||
'PhabricatorAuthChangePasswordAction' => 'applications/auth/action/PhabricatorAuthChangePasswordAction.php',
|
||||
'PhabricatorAuthConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthConduitAPIMethod.php',
|
||||
'PhabricatorAuthConduitTokenRevoker' => 'applications/auth/revoker/PhabricatorAuthConduitTokenRevoker.php',
|
||||
@@ -2273,9 +2296,9 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthInviteVerifyException' => 'applications/auth/exception/PhabricatorAuthInviteVerifyException.php',
|
||||
'PhabricatorAuthInviteWorker' => 'applications/auth/worker/PhabricatorAuthInviteWorker.php',
|
||||
'PhabricatorAuthLinkController' => 'applications/auth/controller/PhabricatorAuthLinkController.php',
|
||||
'PhabricatorAuthLinkMessageType' => 'applications/auth/message/PhabricatorAuthLinkMessageType.php',
|
||||
'PhabricatorAuthListController' => 'applications/auth/controller/config/PhabricatorAuthListController.php',
|
||||
'PhabricatorAuthLoginController' => 'applications/auth/controller/PhabricatorAuthLoginController.php',
|
||||
'PhabricatorAuthLoginHandler' => 'applications/auth/handler/PhabricatorAuthLoginHandler.php',
|
||||
'PhabricatorAuthLoginMessageType' => 'applications/auth/message/PhabricatorAuthLoginMessageType.php',
|
||||
'PhabricatorAuthLogoutConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthLogoutConduitAPIMethod.php',
|
||||
'PhabricatorAuthMFAEditEngineExtension' => 'applications/auth/engineextension/PhabricatorAuthMFAEditEngineExtension.php',
|
||||
@@ -2338,6 +2361,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthProviderConfigTransaction' => 'applications/auth/storage/PhabricatorAuthProviderConfigTransaction.php',
|
||||
'PhabricatorAuthProviderConfigTransactionQuery' => 'applications/auth/query/PhabricatorAuthProviderConfigTransactionQuery.php',
|
||||
'PhabricatorAuthProviderController' => 'applications/auth/controller/config/PhabricatorAuthProviderController.php',
|
||||
'PhabricatorAuthProviderViewController' => 'applications/auth/controller/config/PhabricatorAuthProviderViewController.php',
|
||||
'PhabricatorAuthProvidersGuidanceContext' => 'applications/auth/guidance/PhabricatorAuthProvidersGuidanceContext.php',
|
||||
'PhabricatorAuthProvidersGuidanceEngineExtension' => 'applications/auth/guidance/PhabricatorAuthProvidersGuidanceEngineExtension.php',
|
||||
'PhabricatorAuthQueryPublicKeysConduitAPIMethod' => 'applications/auth/conduit/PhabricatorAuthQueryPublicKeysConduitAPIMethod.php',
|
||||
@@ -2371,6 +2395,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthSessionPHIDType' => 'applications/auth/phid/PhabricatorAuthSessionPHIDType.php',
|
||||
'PhabricatorAuthSessionQuery' => 'applications/auth/query/PhabricatorAuthSessionQuery.php',
|
||||
'PhabricatorAuthSessionRevoker' => 'applications/auth/revoker/PhabricatorAuthSessionRevoker.php',
|
||||
'PhabricatorAuthSetExternalController' => 'applications/auth/controller/PhabricatorAuthSetExternalController.php',
|
||||
'PhabricatorAuthSetPasswordController' => 'applications/auth/controller/PhabricatorAuthSetPasswordController.php',
|
||||
'PhabricatorAuthSetupCheck' => 'applications/config/check/PhabricatorAuthSetupCheck.php',
|
||||
'PhabricatorAuthStartController' => 'applications/auth/controller/PhabricatorAuthStartController.php',
|
||||
@@ -2856,8 +2881,6 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDaemonLog' => 'applications/daemon/storage/PhabricatorDaemonLog.php',
|
||||
'PhabricatorDaemonLogEvent' => 'applications/daemon/storage/PhabricatorDaemonLogEvent.php',
|
||||
'PhabricatorDaemonLogEventGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLogEventGarbageCollector.php',
|
||||
'PhabricatorDaemonLogEventViewController' => 'applications/daemon/controller/PhabricatorDaemonLogEventViewController.php',
|
||||
'PhabricatorDaemonLogEventsView' => 'applications/daemon/view/PhabricatorDaemonLogEventsView.php',
|
||||
'PhabricatorDaemonLogGarbageCollector' => 'applications/daemon/garbagecollector/PhabricatorDaemonLogGarbageCollector.php',
|
||||
'PhabricatorDaemonLogListController' => 'applications/daemon/controller/PhabricatorDaemonLogListController.php',
|
||||
'PhabricatorDaemonLogListView' => 'applications/daemon/view/PhabricatorDaemonLogListView.php',
|
||||
@@ -2888,6 +2911,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDashboardApplication' => 'applications/dashboard/application/PhabricatorDashboardApplication.php',
|
||||
'PhabricatorDashboardArchiveController' => 'applications/dashboard/controller/PhabricatorDashboardArchiveController.php',
|
||||
'PhabricatorDashboardArrangeController' => 'applications/dashboard/controller/PhabricatorDashboardArrangeController.php',
|
||||
'PhabricatorDashboardConsoleController' => 'applications/dashboard/controller/PhabricatorDashboardConsoleController.php',
|
||||
'PhabricatorDashboardController' => 'applications/dashboard/controller/PhabricatorDashboardController.php',
|
||||
'PhabricatorDashboardDAO' => 'applications/dashboard/storage/PhabricatorDashboardDAO.php',
|
||||
'PhabricatorDashboardDashboardHasPanelEdgeType' => 'applications/dashboard/edge/PhabricatorDashboardDashboardHasPanelEdgeType.php',
|
||||
@@ -2927,6 +2951,25 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDashboardPanelTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelTransactionQuery.php',
|
||||
'PhabricatorDashboardPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelType.php',
|
||||
'PhabricatorDashboardPanelViewController' => 'applications/dashboard/controller/PhabricatorDashboardPanelViewController.php',
|
||||
'PhabricatorDashboardPortal' => 'applications/dashboard/storage/PhabricatorDashboardPortal.php',
|
||||
'PhabricatorDashboardPortalController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalController.php',
|
||||
'PhabricatorDashboardPortalEditConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPortalEditConduitAPIMethod.php',
|
||||
'PhabricatorDashboardPortalEditController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalEditController.php',
|
||||
'PhabricatorDashboardPortalEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPortalEditEngine.php',
|
||||
'PhabricatorDashboardPortalEditor' => 'applications/dashboard/editor/PhabricatorDashboardPortalEditor.php',
|
||||
'PhabricatorDashboardPortalListController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalListController.php',
|
||||
'PhabricatorDashboardPortalMenuItem' => 'applications/dashboard/menuitem/PhabricatorDashboardPortalMenuItem.php',
|
||||
'PhabricatorDashboardPortalNameTransaction' => 'applications/dashboard/xaction/portal/PhabricatorDashboardPortalNameTransaction.php',
|
||||
'PhabricatorDashboardPortalPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardPortalPHIDType.php',
|
||||
'PhabricatorDashboardPortalProfileMenuEngine' => 'applications/dashboard/engine/PhabricatorDashboardPortalProfileMenuEngine.php',
|
||||
'PhabricatorDashboardPortalQuery' => 'applications/dashboard/query/PhabricatorDashboardPortalQuery.php',
|
||||
'PhabricatorDashboardPortalSearchConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPortalSearchConduitAPIMethod.php',
|
||||
'PhabricatorDashboardPortalSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPortalSearchEngine.php',
|
||||
'PhabricatorDashboardPortalStatus' => 'applications/dashboard/constants/PhabricatorDashboardPortalStatus.php',
|
||||
'PhabricatorDashboardPortalTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPortalTransaction.php',
|
||||
'PhabricatorDashboardPortalTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPortalTransactionQuery.php',
|
||||
'PhabricatorDashboardPortalTransactionType' => 'applications/dashboard/xaction/portal/PhabricatorDashboardPortalTransactionType.php',
|
||||
'PhabricatorDashboardPortalViewController' => 'applications/dashboard/controller/portal/PhabricatorDashboardPortalViewController.php',
|
||||
'PhabricatorDashboardProfileController' => 'applications/dashboard/controller/PhabricatorDashboardProfileController.php',
|
||||
'PhabricatorDashboardProfileMenuItem' => 'applications/search/menuitem/PhabricatorDashboardProfileMenuItem.php',
|
||||
'PhabricatorDashboardQuery' => 'applications/dashboard/query/PhabricatorDashboardQuery.php',
|
||||
@@ -2958,6 +3001,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDebugController' => 'applications/system/controller/PhabricatorDebugController.php',
|
||||
'PhabricatorDefaultRequestExceptionHandler' => 'aphront/handler/PhabricatorDefaultRequestExceptionHandler.php',
|
||||
'PhabricatorDefaultSyntaxStyle' => 'infrastructure/syntax/PhabricatorDefaultSyntaxStyle.php',
|
||||
'PhabricatorDefaultUnlockEngine' => 'applications/system/engine/PhabricatorDefaultUnlockEngine.php',
|
||||
'PhabricatorDestructibleCodex' => 'applications/system/codex/PhabricatorDestructibleCodex.php',
|
||||
'PhabricatorDestructibleCodexInterface' => 'applications/system/interface/PhabricatorDestructibleCodexInterface.php',
|
||||
'PhabricatorDestructibleInterface' => 'applications/system/interface/PhabricatorDestructibleInterface.php',
|
||||
@@ -2968,6 +3012,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDeveloperPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDeveloperPreferencesSettingsPanel.php',
|
||||
'PhabricatorDiffInlineCommentQuery' => 'infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php',
|
||||
'PhabricatorDiffPreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorDiffPreferencesSettingsPanel.php',
|
||||
'PhabricatorDiffScopeEngine' => 'infrastructure/diff/PhabricatorDiffScopeEngine.php',
|
||||
'PhabricatorDiffScopeEngineTestCase' => 'infrastructure/diff/__tests__/PhabricatorDiffScopeEngineTestCase.php',
|
||||
'PhabricatorDifferenceEngine' => 'infrastructure/diff/PhabricatorDifferenceEngine.php',
|
||||
'PhabricatorDifferentialApplication' => 'applications/differential/application/PhabricatorDifferentialApplication.php',
|
||||
'PhabricatorDifferentialAttachCommitWorkflow' => 'applications/differential/management/PhabricatorDifferentialAttachCommitWorkflow.php',
|
||||
@@ -3093,7 +3139,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorEmojiDatasource' => 'applications/macro/typeahead/PhabricatorEmojiDatasource.php',
|
||||
'PhabricatorEmojiRemarkupRule' => 'applications/macro/markup/PhabricatorEmojiRemarkupRule.php',
|
||||
'PhabricatorEmojiTranslation' => 'infrastructure/internationalization/translation/PhabricatorEmojiTranslation.php',
|
||||
'PhabricatorEmptyQueryException' => 'infrastructure/query/PhabricatorEmptyQueryException.php',
|
||||
'PhabricatorEmptyQueryException' => 'infrastructure/query/exception/PhabricatorEmptyQueryException.php',
|
||||
'PhabricatorEnumConfigType' => 'applications/config/type/PhabricatorEnumConfigType.php',
|
||||
'PhabricatorEnv' => 'infrastructure/env/PhabricatorEnv.php',
|
||||
'PhabricatorEnvTestCase' => 'infrastructure/env/__tests__/PhabricatorEnvTestCase.php',
|
||||
@@ -3370,6 +3416,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorInternationalizationManagementExtractWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementExtractWorkflow.php',
|
||||
'PhabricatorInternationalizationManagementWorkflow' => 'infrastructure/internationalization/management/PhabricatorInternationalizationManagementWorkflow.php',
|
||||
'PhabricatorInvalidConfigSetupCheck' => 'applications/config/check/PhabricatorInvalidConfigSetupCheck.php',
|
||||
'PhabricatorInvalidQueryCursorException' => 'infrastructure/query/exception/PhabricatorInvalidQueryCursorException.php',
|
||||
'PhabricatorIteratedMD5PasswordHasher' => 'infrastructure/util/password/PhabricatorIteratedMD5PasswordHasher.php',
|
||||
'PhabricatorIteratedMD5PasswordHasherTestCase' => 'infrastructure/util/password/__tests__/PhabricatorIteratedMD5PasswordHasherTestCase.php',
|
||||
'PhabricatorIteratorFileUploadSource' => 'applications/files/uploadsource/PhabricatorIteratorFileUploadSource.php',
|
||||
@@ -3442,6 +3489,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorMacroTransactionType' => 'applications/macro/xaction/PhabricatorMacroTransactionType.php',
|
||||
'PhabricatorMacroViewController' => 'applications/macro/controller/PhabricatorMacroViewController.php',
|
||||
'PhabricatorMailAdapter' => 'applications/metamta/adapter/PhabricatorMailAdapter.php',
|
||||
'PhabricatorMailAdapterTestCase' => 'applications/metamta/adapter/__tests__/PhabricatorMailAdapterTestCase.php',
|
||||
'PhabricatorMailAmazonSESAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSESAdapter.php',
|
||||
'PhabricatorMailAmazonSNSAdapter' => 'applications/metamta/adapter/PhabricatorMailAmazonSNSAdapter.php',
|
||||
'PhabricatorMailAttachment' => 'applications/metamta/message/PhabricatorMailAttachment.php',
|
||||
@@ -3556,6 +3604,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorMetaMTASchemaSpec' => 'applications/metamta/storage/PhabricatorMetaMTASchemaSpec.php',
|
||||
'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTASendGridReceiveController.php',
|
||||
'PhabricatorMetaMTAWorker' => 'applications/metamta/PhabricatorMetaMTAWorker.php',
|
||||
'PhabricatorMetronome' => 'infrastructure/util/PhabricatorMetronome.php',
|
||||
'PhabricatorMetronomeTestCase' => 'infrastructure/util/__tests__/PhabricatorMetronomeTestCase.php',
|
||||
'PhabricatorMetronomicTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorMetronomicTriggerClock.php',
|
||||
'PhabricatorModularTransaction' => 'applications/transactions/storage/PhabricatorModularTransaction.php',
|
||||
'PhabricatorModularTransactionType' => 'applications/transactions/storage/PhabricatorModularTransactionType.php',
|
||||
@@ -3666,10 +3716,12 @@ phutil_register_library_map(array(
|
||||
'PhabricatorOlderInlinesSetting' => 'applications/settings/setting/PhabricatorOlderInlinesSetting.php',
|
||||
'PhabricatorOneTimeTriggerClock' => 'infrastructure/daemon/workers/clock/PhabricatorOneTimeTriggerClock.php',
|
||||
'PhabricatorOpcodeCacheSpec' => 'applications/cache/spec/PhabricatorOpcodeCacheSpec.php',
|
||||
'PhabricatorOptionExportField' => 'infrastructure/export/field/PhabricatorOptionExportField.php',
|
||||
'PhabricatorOptionGroupSetting' => 'applications/settings/setting/PhabricatorOptionGroupSetting.php',
|
||||
'PhabricatorOwnerPathQuery' => 'applications/owners/query/PhabricatorOwnerPathQuery.php',
|
||||
'PhabricatorOwnersApplication' => 'applications/owners/application/PhabricatorOwnersApplication.php',
|
||||
'PhabricatorOwnersArchiveController' => 'applications/owners/controller/PhabricatorOwnersArchiveController.php',
|
||||
'PhabricatorOwnersAuditRule' => 'applications/owners/constants/PhabricatorOwnersAuditRule.php',
|
||||
'PhabricatorOwnersConfigOptions' => 'applications/owners/config/PhabricatorOwnersConfigOptions.php',
|
||||
'PhabricatorOwnersConfiguredCustomField' => 'applications/owners/customfield/PhabricatorOwnersConfiguredCustomField.php',
|
||||
'PhabricatorOwnersController' => 'applications/owners/controller/PhabricatorOwnersController.php',
|
||||
@@ -3868,7 +3920,6 @@ phutil_register_library_map(array(
|
||||
'PhabricatorPeopleInviteController' => 'applications/people/controller/PhabricatorPeopleInviteController.php',
|
||||
'PhabricatorPeopleInviteListController' => 'applications/people/controller/PhabricatorPeopleInviteListController.php',
|
||||
'PhabricatorPeopleInviteSendController' => 'applications/people/controller/PhabricatorPeopleInviteSendController.php',
|
||||
'PhabricatorPeopleLdapController' => 'applications/people/controller/PhabricatorPeopleLdapController.php',
|
||||
'PhabricatorPeopleListController' => 'applications/people/controller/PhabricatorPeopleListController.php',
|
||||
'PhabricatorPeopleLogQuery' => 'applications/people/query/PhabricatorPeopleLogQuery.php',
|
||||
'PhabricatorPeopleLogSearchEngine' => 'applications/people/query/PhabricatorPeopleLogSearchEngine.php',
|
||||
@@ -3901,6 +3952,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorPeopleTransactionQuery' => 'applications/people/query/PhabricatorPeopleTransactionQuery.php',
|
||||
'PhabricatorPeopleUserFunctionDatasource' => 'applications/people/typeahead/PhabricatorPeopleUserFunctionDatasource.php',
|
||||
'PhabricatorPeopleUserPHIDType' => 'applications/people/phid/PhabricatorPeopleUserPHIDType.php',
|
||||
'PhabricatorPeopleUsernameMailEngine' => 'applications/people/mail/PhabricatorPeopleUsernameMailEngine.php',
|
||||
'PhabricatorPeopleWelcomeController' => 'applications/people/controller/PhabricatorPeopleWelcomeController.php',
|
||||
'PhabricatorPeopleWelcomeMailEngine' => 'applications/people/mail/PhabricatorPeopleWelcomeMailEngine.php',
|
||||
'PhabricatorPhabricatorAuthProvider' => 'applications/auth/provider/PhabricatorPhabricatorAuthProvider.php',
|
||||
@@ -4009,6 +4061,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProfileMenuItemConfigurationTransactionQuery' => 'applications/search/query/PhabricatorProfileMenuItemConfigurationTransactionQuery.php',
|
||||
'PhabricatorProfileMenuItemIconSet' => 'applications/search/menuitem/PhabricatorProfileMenuItemIconSet.php',
|
||||
'PhabricatorProfileMenuItemPHIDType' => 'applications/search/phidtype/PhabricatorProfileMenuItemPHIDType.php',
|
||||
'PhabricatorProfileMenuItemView' => 'applications/search/engine/PhabricatorProfileMenuItemView.php',
|
||||
'PhabricatorProfileMenuItemViewList' => 'applications/search/engine/PhabricatorProfileMenuItemViewList.php',
|
||||
'PhabricatorProject' => 'applications/project/storage/PhabricatorProject.php',
|
||||
'PhabricatorProjectAddHeraldAction' => 'applications/project/herald/PhabricatorProjectAddHeraldAction.php',
|
||||
'PhabricatorProjectApplication' => 'applications/project/application/PhabricatorProjectApplication.php',
|
||||
@@ -4025,17 +4079,33 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProjectColorTransaction' => 'applications/project/xaction/PhabricatorProjectColorTransaction.php',
|
||||
'PhabricatorProjectColorsConfigType' => 'applications/project/config/PhabricatorProjectColorsConfigType.php',
|
||||
'PhabricatorProjectColumn' => 'applications/project/storage/PhabricatorProjectColumn.php',
|
||||
'PhabricatorProjectColumnAuthorOrder' => 'applications/project/order/PhabricatorProjectColumnAuthorOrder.php',
|
||||
'PhabricatorProjectColumnCreatedOrder' => 'applications/project/order/PhabricatorProjectColumnCreatedOrder.php',
|
||||
'PhabricatorProjectColumnDetailController' => 'applications/project/controller/PhabricatorProjectColumnDetailController.php',
|
||||
'PhabricatorProjectColumnEditController' => 'applications/project/controller/PhabricatorProjectColumnEditController.php',
|
||||
'PhabricatorProjectColumnHeader' => 'applications/project/order/PhabricatorProjectColumnHeader.php',
|
||||
'PhabricatorProjectColumnHideController' => 'applications/project/controller/PhabricatorProjectColumnHideController.php',
|
||||
'PhabricatorProjectColumnLimitTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnLimitTransaction.php',
|
||||
'PhabricatorProjectColumnNameTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnNameTransaction.php',
|
||||
'PhabricatorProjectColumnNaturalOrder' => 'applications/project/order/PhabricatorProjectColumnNaturalOrder.php',
|
||||
'PhabricatorProjectColumnOrder' => 'applications/project/order/PhabricatorProjectColumnOrder.php',
|
||||
'PhabricatorProjectColumnOwnerOrder' => 'applications/project/order/PhabricatorProjectColumnOwnerOrder.php',
|
||||
'PhabricatorProjectColumnPHIDType' => 'applications/project/phid/PhabricatorProjectColumnPHIDType.php',
|
||||
'PhabricatorProjectColumnPointsOrder' => 'applications/project/order/PhabricatorProjectColumnPointsOrder.php',
|
||||
'PhabricatorProjectColumnPosition' => 'applications/project/storage/PhabricatorProjectColumnPosition.php',
|
||||
'PhabricatorProjectColumnPositionQuery' => 'applications/project/query/PhabricatorProjectColumnPositionQuery.php',
|
||||
'PhabricatorProjectColumnPriorityOrder' => 'applications/project/order/PhabricatorProjectColumnPriorityOrder.php',
|
||||
'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php',
|
||||
'PhabricatorProjectColumnRemoveTriggerController' => 'applications/project/controller/PhabricatorProjectColumnRemoveTriggerController.php',
|
||||
'PhabricatorProjectColumnSearchEngine' => 'applications/project/query/PhabricatorProjectColumnSearchEngine.php',
|
||||
'PhabricatorProjectColumnStatusOrder' => 'applications/project/order/PhabricatorProjectColumnStatusOrder.php',
|
||||
'PhabricatorProjectColumnStatusTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnStatusTransaction.php',
|
||||
'PhabricatorProjectColumnTitleOrder' => 'applications/project/order/PhabricatorProjectColumnTitleOrder.php',
|
||||
'PhabricatorProjectColumnTransaction' => 'applications/project/storage/PhabricatorProjectColumnTransaction.php',
|
||||
'PhabricatorProjectColumnTransactionEditor' => 'applications/project/editor/PhabricatorProjectColumnTransactionEditor.php',
|
||||
'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php',
|
||||
'PhabricatorProjectColumnTransactionType' => 'applications/project/xaction/column/PhabricatorProjectColumnTransactionType.php',
|
||||
'PhabricatorProjectColumnTriggerTransaction' => 'applications/project/xaction/column/PhabricatorProjectColumnTriggerTransaction.php',
|
||||
'PhabricatorProjectConfigOptions' => 'applications/project/config/PhabricatorProjectConfigOptions.php',
|
||||
'PhabricatorProjectConfiguredCustomField' => 'applications/project/customfield/PhabricatorProjectConfiguredCustomField.php',
|
||||
'PhabricatorProjectController' => 'applications/project/controller/PhabricatorProjectController.php',
|
||||
@@ -4050,6 +4120,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProjectDefaultController' => 'applications/project/controller/PhabricatorProjectDefaultController.php',
|
||||
'PhabricatorProjectDescriptionField' => 'applications/project/customfield/PhabricatorProjectDescriptionField.php',
|
||||
'PhabricatorProjectDetailsProfileMenuItem' => 'applications/project/menuitem/PhabricatorProjectDetailsProfileMenuItem.php',
|
||||
'PhabricatorProjectDropEffect' => 'applications/project/icon/PhabricatorProjectDropEffect.php',
|
||||
'PhabricatorProjectEditController' => 'applications/project/controller/PhabricatorProjectEditController.php',
|
||||
'PhabricatorProjectEditEngine' => 'applications/project/engine/PhabricatorProjectEditEngine.php',
|
||||
'PhabricatorProjectEditPictureController' => 'applications/project/controller/PhabricatorProjectEditPictureController.php',
|
||||
@@ -4128,6 +4199,30 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProjectTransactionEditor' => 'applications/project/editor/PhabricatorProjectTransactionEditor.php',
|
||||
'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php',
|
||||
'PhabricatorProjectTransactionType' => 'applications/project/xaction/PhabricatorProjectTransactionType.php',
|
||||
'PhabricatorProjectTrigger' => 'applications/project/storage/PhabricatorProjectTrigger.php',
|
||||
'PhabricatorProjectTriggerController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerController.php',
|
||||
'PhabricatorProjectTriggerCorruptionException' => 'applications/project/exception/PhabricatorProjectTriggerCorruptionException.php',
|
||||
'PhabricatorProjectTriggerEditController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerEditController.php',
|
||||
'PhabricatorProjectTriggerEditor' => 'applications/project/editor/PhabricatorProjectTriggerEditor.php',
|
||||
'PhabricatorProjectTriggerInvalidRule' => 'applications/project/trigger/PhabricatorProjectTriggerInvalidRule.php',
|
||||
'PhabricatorProjectTriggerListController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerListController.php',
|
||||
'PhabricatorProjectTriggerManiphestPriorityRule' => 'applications/project/trigger/PhabricatorProjectTriggerManiphestPriorityRule.php',
|
||||
'PhabricatorProjectTriggerManiphestStatusRule' => 'applications/project/trigger/PhabricatorProjectTriggerManiphestStatusRule.php',
|
||||
'PhabricatorProjectTriggerNameTransaction' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerNameTransaction.php',
|
||||
'PhabricatorProjectTriggerPHIDType' => 'applications/project/phid/PhabricatorProjectTriggerPHIDType.php',
|
||||
'PhabricatorProjectTriggerPlaySoundRule' => 'applications/project/trigger/PhabricatorProjectTriggerPlaySoundRule.php',
|
||||
'PhabricatorProjectTriggerQuery' => 'applications/project/query/PhabricatorProjectTriggerQuery.php',
|
||||
'PhabricatorProjectTriggerRule' => 'applications/project/trigger/PhabricatorProjectTriggerRule.php',
|
||||
'PhabricatorProjectTriggerRuleRecord' => 'applications/project/trigger/PhabricatorProjectTriggerRuleRecord.php',
|
||||
'PhabricatorProjectTriggerRulesetTransaction' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerRulesetTransaction.php',
|
||||
'PhabricatorProjectTriggerSearchEngine' => 'applications/project/query/PhabricatorProjectTriggerSearchEngine.php',
|
||||
'PhabricatorProjectTriggerTransaction' => 'applications/project/storage/PhabricatorProjectTriggerTransaction.php',
|
||||
'PhabricatorProjectTriggerTransactionQuery' => 'applications/project/query/PhabricatorProjectTriggerTransactionQuery.php',
|
||||
'PhabricatorProjectTriggerTransactionType' => 'applications/project/xaction/trigger/PhabricatorProjectTriggerTransactionType.php',
|
||||
'PhabricatorProjectTriggerUnknownRule' => 'applications/project/trigger/PhabricatorProjectTriggerUnknownRule.php',
|
||||
'PhabricatorProjectTriggerUsage' => 'applications/project/storage/PhabricatorProjectTriggerUsage.php',
|
||||
'PhabricatorProjectTriggerUsageIndexEngineExtension' => 'applications/project/engineextension/PhabricatorProjectTriggerUsageIndexEngineExtension.php',
|
||||
'PhabricatorProjectTriggerViewController' => 'applications/project/controller/trigger/PhabricatorProjectTriggerViewController.php',
|
||||
'PhabricatorProjectTypeTransaction' => 'applications/project/xaction/PhabricatorProjectTypeTransaction.php',
|
||||
'PhabricatorProjectUIEventListener' => 'applications/project/events/PhabricatorProjectUIEventListener.php',
|
||||
'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php',
|
||||
@@ -4159,6 +4254,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorPygmentSetupCheck' => 'applications/config/check/PhabricatorPygmentSetupCheck.php',
|
||||
'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php',
|
||||
'PhabricatorQueryConstraint' => 'infrastructure/query/constraint/PhabricatorQueryConstraint.php',
|
||||
'PhabricatorQueryCursor' => 'infrastructure/query/policy/PhabricatorQueryCursor.php',
|
||||
'PhabricatorQueryIterator' => 'infrastructure/storage/lisk/PhabricatorQueryIterator.php',
|
||||
'PhabricatorQueryOrderItem' => 'infrastructure/query/order/PhabricatorQueryOrderItem.php',
|
||||
'PhabricatorQueryOrderTestCase' => 'infrastructure/query/order/__tests__/PhabricatorQueryOrderTestCase.php',
|
||||
@@ -4681,6 +4777,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorUnitTestContentSource' => 'infrastructure/contentsource/PhabricatorUnitTestContentSource.php',
|
||||
'PhabricatorUnitsTestCase' => 'view/__tests__/PhabricatorUnitsTestCase.php',
|
||||
'PhabricatorUnknownContentSource' => 'infrastructure/contentsource/PhabricatorUnknownContentSource.php',
|
||||
'PhabricatorUnlockEngine' => 'applications/system/engine/PhabricatorUnlockEngine.php',
|
||||
'PhabricatorUnlockableInterface' => 'applications/system/interface/PhabricatorUnlockableInterface.php',
|
||||
'PhabricatorUnsubscribedFromObjectEdgeType' => 'applications/transactions/edges/PhabricatorUnsubscribedFromObjectEdgeType.php',
|
||||
'PhabricatorUser' => 'applications/people/storage/PhabricatorUser.php',
|
||||
'PhabricatorUserApproveTransaction' => 'applications/people/xaction/PhabricatorUserApproveTransaction.php',
|
||||
@@ -4988,6 +5086,7 @@ phutil_register_library_map(array(
|
||||
'PhortuneAccountViewController' => 'applications/phortune/controller/account/PhortuneAccountViewController.php',
|
||||
'PhortuneAdHocCart' => 'applications/phortune/cart/PhortuneAdHocCart.php',
|
||||
'PhortuneAdHocProduct' => 'applications/phortune/product/PhortuneAdHocProduct.php',
|
||||
'PhortuneAddPaymentMethodAction' => 'applications/phortune/action/PhortuneAddPaymentMethodAction.php',
|
||||
'PhortuneCart' => 'applications/phortune/storage/PhortuneCart.php',
|
||||
'PhortuneCartAcceptController' => 'applications/phortune/controller/cart/PhortuneCartAcceptController.php',
|
||||
'PhortuneCartCancelController' => 'applications/phortune/controller/cart/PhortuneCartCancelController.php',
|
||||
@@ -5016,6 +5115,7 @@ phutil_register_library_map(array(
|
||||
'PhortuneCurrencySerializer' => 'applications/phortune/currency/PhortuneCurrencySerializer.php',
|
||||
'PhortuneCurrencyTestCase' => 'applications/phortune/currency/__tests__/PhortuneCurrencyTestCase.php',
|
||||
'PhortuneDAO' => 'applications/phortune/storage/PhortuneDAO.php',
|
||||
'PhortuneDisplayException' => 'applications/phortune/exception/PhortuneDisplayException.php',
|
||||
'PhortuneErrCode' => 'applications/phortune/constants/PhortuneErrCode.php',
|
||||
'PhortuneInvoiceView' => 'applications/phortune/view/PhortuneInvoiceView.php',
|
||||
'PhortuneLandingController' => 'applications/phortune/controller/PhortuneLandingController.php',
|
||||
@@ -6165,6 +6265,7 @@ phutil_register_library_map(array(
|
||||
'DifferentialRevisionUpdateTransaction' => 'DifferentialRevisionTransactionType',
|
||||
'DifferentialRevisionViewController' => 'DifferentialController',
|
||||
'DifferentialRevisionVoidTransaction' => 'DifferentialRevisionTransactionType',
|
||||
'DifferentialRevisionWrongBuildsTransaction' => 'DifferentialRevisionTransactionType',
|
||||
'DifferentialRevisionWrongStateTransaction' => 'DifferentialRevisionTransactionType',
|
||||
'DifferentialSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
||||
'DifferentialSetDiffPropertyConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
||||
@@ -6930,19 +7031,28 @@ phutil_register_library_map(array(
|
||||
'PhabricatorNgramsInterface',
|
||||
'PhabricatorConduitResultInterface',
|
||||
'PhabricatorProjectInterface',
|
||||
'PhabricatorPolicyCodexInterface',
|
||||
),
|
||||
'HarbormasterBuildPlanBehavior' => 'Phobject',
|
||||
'HarbormasterBuildPlanBehaviorOption' => 'Phobject',
|
||||
'HarbormasterBuildPlanBehaviorTransaction' => 'HarbormasterBuildPlanTransactionType',
|
||||
'HarbormasterBuildPlanDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||
'HarbormasterBuildPlanDefaultEditCapability' => 'PhabricatorPolicyCapability',
|
||||
'HarbormasterBuildPlanDefaultViewCapability' => 'PhabricatorPolicyCapability',
|
||||
'HarbormasterBuildPlanEditAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
||||
'HarbormasterBuildPlanEditEngine' => 'PhabricatorEditEngine',
|
||||
'HarbormasterBuildPlanEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'HarbormasterBuildPlanNameNgrams' => 'PhabricatorSearchNgrams',
|
||||
'HarbormasterBuildPlanNameTransaction' => 'HarbormasterBuildPlanTransactionType',
|
||||
'HarbormasterBuildPlanPHIDType' => 'PhabricatorPHIDType',
|
||||
'HarbormasterBuildPlanPolicyCodex' => 'PhabricatorPolicyCodex',
|
||||
'HarbormasterBuildPlanQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'HarbormasterBuildPlanSearchAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
||||
'HarbormasterBuildPlanSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
'HarbormasterBuildPlanTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'HarbormasterBuildPlanStatusTransaction' => 'HarbormasterBuildPlanTransactionType',
|
||||
'HarbormasterBuildPlanTransaction' => 'PhabricatorModularTransaction',
|
||||
'HarbormasterBuildPlanTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'HarbormasterBuildPlanTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'HarbormasterBuildQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'HarbormasterBuildRequest' => 'Phobject',
|
||||
'HarbormasterBuildSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
||||
@@ -6980,7 +7090,12 @@ phutil_register_library_map(array(
|
||||
'HarbormasterBuildTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'HarbormasterBuildTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'HarbormasterBuildTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'HarbormasterBuildUnitMessage' => 'HarbormasterDAO',
|
||||
'HarbormasterBuildUnitMessage' => array(
|
||||
'HarbormasterDAO',
|
||||
'PhabricatorPolicyInterface',
|
||||
),
|
||||
'HarbormasterBuildUnitMessageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'HarbormasterBuildView' => 'AphrontView',
|
||||
'HarbormasterBuildViewController' => 'HarbormasterController',
|
||||
'HarbormasterBuildWorker' => 'HarbormasterWorker',
|
||||
'HarbormasterBuildable' => array(
|
||||
@@ -7037,6 +7152,7 @@ phutil_register_library_map(array(
|
||||
'HarbormasterMessageType' => 'Phobject',
|
||||
'HarbormasterObject' => 'HarbormasterDAO',
|
||||
'HarbormasterOtherBuildStepGroup' => 'HarbormasterBuildStepGroup',
|
||||
'HarbormasterPlanBehaviorController' => 'HarbormasterPlanController',
|
||||
'HarbormasterPlanController' => 'HarbormasterController',
|
||||
'HarbormasterPlanDisableController' => 'HarbormasterPlanController',
|
||||
'HarbormasterPlanEditController' => 'HarbormasterPlanController',
|
||||
@@ -7050,6 +7166,7 @@ phutil_register_library_map(array(
|
||||
'HarbormasterQueryBuildsConduitAPIMethod' => 'HarbormasterConduitAPIMethod',
|
||||
'HarbormasterQueryBuildsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
|
||||
'HarbormasterRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
||||
'HarbormasterRestartException' => 'Exception',
|
||||
'HarbormasterRunBuildPlansHeraldAction' => 'HeraldAction',
|
||||
'HarbormasterSchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
||||
'HarbormasterScratchTable' => 'HarbormasterDAO',
|
||||
@@ -7059,6 +7176,7 @@ phutil_register_library_map(array(
|
||||
'HarbormasterStepDeleteController' => 'HarbormasterPlanController',
|
||||
'HarbormasterStepEditController' => 'HarbormasterPlanController',
|
||||
'HarbormasterStepViewController' => 'HarbormasterPlanController',
|
||||
'HarbormasterString' => 'HarbormasterDAO',
|
||||
'HarbormasterTargetEngine' => 'Phobject',
|
||||
'HarbormasterTargetSearchAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
||||
'HarbormasterTargetWorker' => 'HarbormasterWorker',
|
||||
@@ -7148,24 +7266,31 @@ phutil_register_library_map(array(
|
||||
'PhabricatorFlaggableInterface',
|
||||
'PhabricatorPolicyInterface',
|
||||
'PhabricatorDestructibleInterface',
|
||||
'PhabricatorIndexableInterface',
|
||||
'PhabricatorSubscribableInterface',
|
||||
),
|
||||
'HeraldRuleActionAffectsObjectEdgeType' => 'PhabricatorEdgeType',
|
||||
'HeraldRuleAdapter' => 'HeraldAdapter',
|
||||
'HeraldRuleAdapterField' => 'HeraldRuleField',
|
||||
'HeraldRuleController' => 'HeraldController',
|
||||
'HeraldRuleDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||
'HeraldRuleDisableTransaction' => 'HeraldRuleTransactionType',
|
||||
'HeraldRuleEditTransaction' => 'HeraldRuleTransactionType',
|
||||
'HeraldRuleEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'HeraldRuleField' => 'HeraldField',
|
||||
'HeraldRuleFieldGroup' => 'HeraldFieldGroup',
|
||||
'HeraldRuleIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
||||
'HeraldRuleListController' => 'HeraldController',
|
||||
'HeraldRuleListView' => 'AphrontView',
|
||||
'HeraldRuleNameTransaction' => 'HeraldRuleTransactionType',
|
||||
'HeraldRulePHIDType' => 'PhabricatorPHIDType',
|
||||
'HeraldRuleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'HeraldRuleReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
|
||||
'HeraldRuleSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
'HeraldRuleSerializer' => 'Phobject',
|
||||
'HeraldRuleTestCase' => 'PhabricatorTestCase',
|
||||
'HeraldRuleTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'HeraldRuleTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
||||
'HeraldRuleTransaction' => 'PhabricatorModularTransaction',
|
||||
'HeraldRuleTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'HeraldRuleTranscript' => 'Phobject',
|
||||
'HeraldRuleTypeConfig' => 'Phobject',
|
||||
'HeraldRuleTypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||
@@ -7354,7 +7479,6 @@ phutil_register_library_map(array(
|
||||
'ManiphestStatusEmailCommand' => 'ManiphestEmailCommand',
|
||||
'ManiphestStatusSearchConduitAPIMethod' => 'ManiphestConduitAPIMethod',
|
||||
'ManiphestStatusesConfigType' => 'PhabricatorJSONConfigType',
|
||||
'ManiphestSubpriorityController' => 'ManiphestController',
|
||||
'ManiphestSubtypesConfigType' => 'PhabricatorJSONConfigType',
|
||||
'ManiphestTask' => array(
|
||||
'ManiphestDAO',
|
||||
@@ -7377,6 +7501,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorEditEngineSubtypeInterface',
|
||||
'PhabricatorEditEngineLockableInterface',
|
||||
'PhabricatorEditEngineMFAInterface',
|
||||
'PhabricatorPolicyCodexInterface',
|
||||
'PhabricatorUnlockableInterface',
|
||||
),
|
||||
'ManiphestTaskAssignHeraldAction' => 'HeraldAction',
|
||||
'ManiphestTaskAssignOtherHeraldAction' => 'ManiphestTaskAssignHeraldAction',
|
||||
@@ -7400,6 +7526,7 @@ phutil_register_library_map(array(
|
||||
'ManiphestTaskFerretEngine' => 'PhabricatorFerretEngine',
|
||||
'ManiphestTaskFulltextEngine' => 'PhabricatorFulltextEngine',
|
||||
'ManiphestTaskGraph' => 'PhabricatorObjectGraph',
|
||||
'ManiphestTaskGraphController' => 'ManiphestController',
|
||||
'ManiphestTaskHasCommitEdgeType' => 'PhabricatorEdgeType',
|
||||
'ManiphestTaskHasCommitRelationship' => 'ManiphestTaskRelationship',
|
||||
'ManiphestTaskHasDuplicateTaskEdgeType' => 'PhabricatorEdgeType',
|
||||
@@ -7427,6 +7554,7 @@ phutil_register_library_map(array(
|
||||
'ManiphestTaskParentTransaction' => 'ManiphestTaskTransactionType',
|
||||
'ManiphestTaskPoints' => 'Phobject',
|
||||
'ManiphestTaskPointsTransaction' => 'ManiphestTaskTransactionType',
|
||||
'ManiphestTaskPolicyCodex' => 'PhabricatorPolicyCodex',
|
||||
'ManiphestTaskPriority' => 'ManiphestConstants',
|
||||
'ManiphestTaskPriorityDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||
'ManiphestTaskPriorityHeraldAction' => 'HeraldAction',
|
||||
@@ -7447,11 +7575,11 @@ phutil_register_library_map(array(
|
||||
'ManiphestTaskSubpriorityTransaction' => 'ManiphestTaskTransactionType',
|
||||
'ManiphestTaskSubtaskController' => 'ManiphestController',
|
||||
'ManiphestTaskSubtypeDatasource' => 'PhabricatorTypeaheadDatasource',
|
||||
'ManiphestTaskTestCase' => 'PhabricatorTestCase',
|
||||
'ManiphestTaskTitleHeraldField' => 'ManiphestTaskHeraldField',
|
||||
'ManiphestTaskTitleTransaction' => 'ManiphestTaskTransactionType',
|
||||
'ManiphestTaskTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'ManiphestTaskUnblockTransaction' => 'ManiphestTaskTransactionType',
|
||||
'ManiphestTaskUnlockEngine' => 'PhabricatorUnlockEngine',
|
||||
'ManiphestTransaction' => 'PhabricatorModularTransaction',
|
||||
'ManiphestTransactionComment' => 'PhabricatorApplicationTransactionComment',
|
||||
'ManiphestTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
@@ -7930,6 +8058,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthChallengeGarbageCollector' => 'PhabricatorGarbageCollector',
|
||||
'PhabricatorAuthChallengePHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorAuthChallengeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorAuthChallengeStatusController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthChallengeUpdate' => 'Phobject',
|
||||
'PhabricatorAuthChangePasswordAction' => 'PhabricatorSystemAction',
|
||||
'PhabricatorAuthConduitAPIMethod' => 'ConduitAPIMethod',
|
||||
'PhabricatorAuthConduitTokenRevoker' => 'PhabricatorAuthRevoker',
|
||||
@@ -8024,9 +8154,9 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthInviteVerifyException' => 'PhabricatorAuthInviteDialogException',
|
||||
'PhabricatorAuthInviteWorker' => 'PhabricatorWorker',
|
||||
'PhabricatorAuthLinkController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthLinkMessageType' => 'PhabricatorAuthMessageType',
|
||||
'PhabricatorAuthListController' => 'PhabricatorAuthProviderConfigController',
|
||||
'PhabricatorAuthLoginController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthLoginHandler' => 'Phobject',
|
||||
'PhabricatorAuthLoginMessageType' => 'PhabricatorAuthMessageType',
|
||||
'PhabricatorAuthLogoutConduitAPIMethod' => 'PhabricatorAuthConduitAPIMethod',
|
||||
'PhabricatorAuthMFAEditEngineExtension' => 'PhabricatorEditEngineExtension',
|
||||
@@ -8102,6 +8232,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthProviderConfigTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'PhabricatorAuthProviderConfigTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorAuthProviderController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthProviderViewController' => 'PhabricatorAuthProviderConfigController',
|
||||
'PhabricatorAuthProvidersGuidanceContext' => 'PhabricatorGuidanceContext',
|
||||
'PhabricatorAuthProvidersGuidanceEngineExtension' => 'PhabricatorGuidanceEngineExtension',
|
||||
'PhabricatorAuthQueryPublicKeysConduitAPIMethod' => 'PhabricatorAuthConduitAPIMethod',
|
||||
@@ -8143,6 +8274,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorAuthSessionPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorAuthSessionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorAuthSessionRevoker' => 'PhabricatorAuthRevoker',
|
||||
'PhabricatorAuthSetExternalController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthSetPasswordController' => 'PhabricatorAuthController',
|
||||
'PhabricatorAuthSetupCheck' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorAuthStartController' => 'PhabricatorAuthController',
|
||||
@@ -8709,8 +8841,6 @@ phutil_register_library_map(array(
|
||||
),
|
||||
'PhabricatorDaemonLogEvent' => 'PhabricatorDaemonDAO',
|
||||
'PhabricatorDaemonLogEventGarbageCollector' => 'PhabricatorGarbageCollector',
|
||||
'PhabricatorDaemonLogEventViewController' => 'PhabricatorDaemonController',
|
||||
'PhabricatorDaemonLogEventsView' => 'AphrontView',
|
||||
'PhabricatorDaemonLogGarbageCollector' => 'PhabricatorGarbageCollector',
|
||||
'PhabricatorDaemonLogListController' => 'PhabricatorDaemonController',
|
||||
'PhabricatorDaemonLogListView' => 'AphrontView',
|
||||
@@ -8749,6 +8879,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDashboardApplication' => 'PhabricatorApplication',
|
||||
'PhabricatorDashboardArchiveController' => 'PhabricatorDashboardController',
|
||||
'PhabricatorDashboardArrangeController' => 'PhabricatorDashboardProfileController',
|
||||
'PhabricatorDashboardConsoleController' => 'PhabricatorDashboardController',
|
||||
'PhabricatorDashboardController' => 'PhabricatorController',
|
||||
'PhabricatorDashboardDAO' => 'PhabricatorLiskDAO',
|
||||
'PhabricatorDashboardDashboardHasPanelEdgeType' => 'PhabricatorEdgeType',
|
||||
@@ -8799,6 +8930,30 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDashboardPanelTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorDashboardPanelType' => 'Phobject',
|
||||
'PhabricatorDashboardPanelViewController' => 'PhabricatorDashboardController',
|
||||
'PhabricatorDashboardPortal' => array(
|
||||
'PhabricatorDashboardDAO',
|
||||
'PhabricatorApplicationTransactionInterface',
|
||||
'PhabricatorPolicyInterface',
|
||||
'PhabricatorDestructibleInterface',
|
||||
),
|
||||
'PhabricatorDashboardPortalController' => 'PhabricatorDashboardController',
|
||||
'PhabricatorDashboardPortalEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
||||
'PhabricatorDashboardPortalEditController' => 'PhabricatorDashboardPortalController',
|
||||
'PhabricatorDashboardPortalEditEngine' => 'PhabricatorEditEngine',
|
||||
'PhabricatorDashboardPortalEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'PhabricatorDashboardPortalListController' => 'PhabricatorDashboardPortalController',
|
||||
'PhabricatorDashboardPortalMenuItem' => 'PhabricatorProfileMenuItem',
|
||||
'PhabricatorDashboardPortalNameTransaction' => 'PhabricatorDashboardPortalTransactionType',
|
||||
'PhabricatorDashboardPortalPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorDashboardPortalProfileMenuEngine' => 'PhabricatorProfileMenuEngine',
|
||||
'PhabricatorDashboardPortalQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorDashboardPortalSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
|
||||
'PhabricatorDashboardPortalSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
'PhabricatorDashboardPortalStatus' => 'Phobject',
|
||||
'PhabricatorDashboardPortalTransaction' => 'PhabricatorModularTransaction',
|
||||
'PhabricatorDashboardPortalTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorDashboardPortalTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'PhabricatorDashboardPortalViewController' => 'PhabricatorDashboardPortalController',
|
||||
'PhabricatorDashboardProfileController' => 'PhabricatorController',
|
||||
'PhabricatorDashboardProfileMenuItem' => 'PhabricatorProfileMenuItem',
|
||||
'PhabricatorDashboardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
@@ -8830,6 +8985,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDebugController' => 'PhabricatorController',
|
||||
'PhabricatorDefaultRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
|
||||
'PhabricatorDefaultSyntaxStyle' => 'PhabricatorSyntaxStyle',
|
||||
'PhabricatorDefaultUnlockEngine' => 'PhabricatorUnlockEngine',
|
||||
'PhabricatorDestructibleCodex' => 'Phobject',
|
||||
'PhabricatorDestructionEngine' => 'Phobject',
|
||||
'PhabricatorDestructionEngineExtension' => 'Phobject',
|
||||
@@ -8838,6 +8994,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorDeveloperPreferencesSettingsPanel' => 'PhabricatorEditEngineSettingsPanel',
|
||||
'PhabricatorDiffInlineCommentQuery' => 'PhabricatorApplicationTransactionCommentQuery',
|
||||
'PhabricatorDiffPreferencesSettingsPanel' => 'PhabricatorEditEngineSettingsPanel',
|
||||
'PhabricatorDiffScopeEngine' => 'Phobject',
|
||||
'PhabricatorDiffScopeEngineTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorDifferenceEngine' => 'Phobject',
|
||||
'PhabricatorDifferentialApplication' => 'PhabricatorApplication',
|
||||
'PhabricatorDifferentialAttachCommitWorkflow' => 'PhabricatorDifferentialManagementWorkflow',
|
||||
@@ -9288,6 +9446,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorInternationalizationManagementExtractWorkflow' => 'PhabricatorInternationalizationManagementWorkflow',
|
||||
'PhabricatorInternationalizationManagementWorkflow' => 'PhabricatorManagementWorkflow',
|
||||
'PhabricatorInvalidConfigSetupCheck' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorInvalidQueryCursorException' => 'Exception',
|
||||
'PhabricatorIteratedMD5PasswordHasher' => 'PhabricatorPasswordHasher',
|
||||
'PhabricatorIteratedMD5PasswordHasherTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorIteratorFileUploadSource' => 'PhabricatorFileUploadSource',
|
||||
@@ -9360,6 +9519,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorMacroTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'PhabricatorMacroViewController' => 'PhabricatorMacroController',
|
||||
'PhabricatorMailAdapter' => 'Phobject',
|
||||
'PhabricatorMailAdapterTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorMailAmazonSESAdapter' => 'PhabricatorMailAdapter',
|
||||
'PhabricatorMailAmazonSNSAdapter' => 'PhabricatorMailAdapter',
|
||||
'PhabricatorMailAttachment' => 'Phobject',
|
||||
@@ -9488,6 +9648,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorMetaMTASchemaSpec' => 'PhabricatorConfigSchemaSpec',
|
||||
'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController',
|
||||
'PhabricatorMetaMTAWorker' => 'PhabricatorWorker',
|
||||
'PhabricatorMetronome' => 'Phobject',
|
||||
'PhabricatorMetronomeTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorMetronomicTriggerClock' => 'PhabricatorTriggerClock',
|
||||
'PhabricatorModularTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'PhabricatorModularTransactionType' => 'Phobject',
|
||||
@@ -9615,10 +9777,12 @@ phutil_register_library_map(array(
|
||||
'PhabricatorOlderInlinesSetting' => 'PhabricatorSelectSetting',
|
||||
'PhabricatorOneTimeTriggerClock' => 'PhabricatorTriggerClock',
|
||||
'PhabricatorOpcodeCacheSpec' => 'PhabricatorCacheSpec',
|
||||
'PhabricatorOptionExportField' => 'PhabricatorExportField',
|
||||
'PhabricatorOptionGroupSetting' => 'PhabricatorSetting',
|
||||
'PhabricatorOwnerPathQuery' => 'Phobject',
|
||||
'PhabricatorOwnersApplication' => 'PhabricatorApplication',
|
||||
'PhabricatorOwnersArchiveController' => 'PhabricatorOwnersController',
|
||||
'PhabricatorOwnersAuditRule' => 'Phobject',
|
||||
'PhabricatorOwnersConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||
'PhabricatorOwnersConfiguredCustomField' => array(
|
||||
'PhabricatorOwnersCustomField',
|
||||
@@ -9869,7 +10033,6 @@ phutil_register_library_map(array(
|
||||
'PhabricatorPeopleInviteController' => 'PhabricatorPeopleController',
|
||||
'PhabricatorPeopleInviteListController' => 'PhabricatorPeopleInviteController',
|
||||
'PhabricatorPeopleInviteSendController' => 'PhabricatorPeopleInviteController',
|
||||
'PhabricatorPeopleLdapController' => 'PhabricatorPeopleController',
|
||||
'PhabricatorPeopleListController' => 'PhabricatorPeopleController',
|
||||
'PhabricatorPeopleLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorPeopleLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
@@ -9902,6 +10065,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorPeopleTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorPeopleUserFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
|
||||
'PhabricatorPeopleUserPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorPeopleUsernameMailEngine' => 'PhabricatorPeopleMailEngine',
|
||||
'PhabricatorPeopleWelcomeController' => 'PhabricatorPeopleController',
|
||||
'PhabricatorPeopleWelcomeMailEngine' => 'PhabricatorPeopleMailEngine',
|
||||
'PhabricatorPhabricatorAuthProvider' => 'PhabricatorOAuth2AuthProvider',
|
||||
@@ -10035,6 +10199,8 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProfileMenuItemConfigurationTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorProfileMenuItemIconSet' => 'PhabricatorIconSet',
|
||||
'PhabricatorProfileMenuItemPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorProfileMenuItemView' => 'Phobject',
|
||||
'PhabricatorProfileMenuItemViewList' => 'Phobject',
|
||||
'PhabricatorProject' => array(
|
||||
'PhabricatorProjectDAO',
|
||||
'PhabricatorApplicationTransactionInterface',
|
||||
@@ -10072,20 +10238,36 @@ phutil_register_library_map(array(
|
||||
'PhabricatorExtendedPolicyInterface',
|
||||
'PhabricatorConduitResultInterface',
|
||||
),
|
||||
'PhabricatorProjectColumnAuthorOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnCreatedOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnDetailController' => 'PhabricatorProjectBoardController',
|
||||
'PhabricatorProjectColumnEditController' => 'PhabricatorProjectBoardController',
|
||||
'PhabricatorProjectColumnHeader' => 'Phobject',
|
||||
'PhabricatorProjectColumnHideController' => 'PhabricatorProjectBoardController',
|
||||
'PhabricatorProjectColumnLimitTransaction' => 'PhabricatorProjectColumnTransactionType',
|
||||
'PhabricatorProjectColumnNameTransaction' => 'PhabricatorProjectColumnTransactionType',
|
||||
'PhabricatorProjectColumnNaturalOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnOrder' => 'Phobject',
|
||||
'PhabricatorProjectColumnOwnerOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorProjectColumnPointsOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnPosition' => array(
|
||||
'PhabricatorProjectDAO',
|
||||
'PhabricatorPolicyInterface',
|
||||
),
|
||||
'PhabricatorProjectColumnPositionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorProjectColumnPriorityOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorProjectColumnRemoveTriggerController' => 'PhabricatorProjectBoardController',
|
||||
'PhabricatorProjectColumnSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
'PhabricatorProjectColumnTransaction' => 'PhabricatorApplicationTransaction',
|
||||
'PhabricatorProjectColumnStatusOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnStatusTransaction' => 'PhabricatorProjectColumnTransactionType',
|
||||
'PhabricatorProjectColumnTitleOrder' => 'PhabricatorProjectColumnOrder',
|
||||
'PhabricatorProjectColumnTransaction' => 'PhabricatorModularTransaction',
|
||||
'PhabricatorProjectColumnTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorProjectColumnTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'PhabricatorProjectColumnTriggerTransaction' => 'PhabricatorProjectColumnTransactionType',
|
||||
'PhabricatorProjectConfigOptions' => 'PhabricatorApplicationConfigOptions',
|
||||
'PhabricatorProjectConfiguredCustomField' => array(
|
||||
'PhabricatorProjectStandardCustomField',
|
||||
@@ -10103,6 +10285,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProjectDefaultController' => 'PhabricatorProjectBoardController',
|
||||
'PhabricatorProjectDescriptionField' => 'PhabricatorProjectStandardCustomField',
|
||||
'PhabricatorProjectDetailsProfileMenuItem' => 'PhabricatorProfileMenuItem',
|
||||
'PhabricatorProjectDropEffect' => 'Phobject',
|
||||
'PhabricatorProjectEditController' => 'PhabricatorProjectController',
|
||||
'PhabricatorProjectEditEngine' => 'PhabricatorEditEngine',
|
||||
'PhabricatorProjectEditPictureController' => 'PhabricatorProjectController',
|
||||
@@ -10183,6 +10366,36 @@ phutil_register_library_map(array(
|
||||
'PhabricatorProjectTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorProjectTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'PhabricatorProjectTrigger' => array(
|
||||
'PhabricatorProjectDAO',
|
||||
'PhabricatorApplicationTransactionInterface',
|
||||
'PhabricatorPolicyInterface',
|
||||
'PhabricatorIndexableInterface',
|
||||
'PhabricatorDestructibleInterface',
|
||||
),
|
||||
'PhabricatorProjectTriggerController' => 'PhabricatorProjectController',
|
||||
'PhabricatorProjectTriggerCorruptionException' => 'Exception',
|
||||
'PhabricatorProjectTriggerEditController' => 'PhabricatorProjectTriggerController',
|
||||
'PhabricatorProjectTriggerEditor' => 'PhabricatorApplicationTransactionEditor',
|
||||
'PhabricatorProjectTriggerInvalidRule' => 'PhabricatorProjectTriggerRule',
|
||||
'PhabricatorProjectTriggerListController' => 'PhabricatorProjectTriggerController',
|
||||
'PhabricatorProjectTriggerManiphestPriorityRule' => 'PhabricatorProjectTriggerRule',
|
||||
'PhabricatorProjectTriggerManiphestStatusRule' => 'PhabricatorProjectTriggerRule',
|
||||
'PhabricatorProjectTriggerNameTransaction' => 'PhabricatorProjectTriggerTransactionType',
|
||||
'PhabricatorProjectTriggerPHIDType' => 'PhabricatorPHIDType',
|
||||
'PhabricatorProjectTriggerPlaySoundRule' => 'PhabricatorProjectTriggerRule',
|
||||
'PhabricatorProjectTriggerQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
'PhabricatorProjectTriggerRule' => 'Phobject',
|
||||
'PhabricatorProjectTriggerRuleRecord' => 'Phobject',
|
||||
'PhabricatorProjectTriggerRulesetTransaction' => 'PhabricatorProjectTriggerTransactionType',
|
||||
'PhabricatorProjectTriggerSearchEngine' => 'PhabricatorApplicationSearchEngine',
|
||||
'PhabricatorProjectTriggerTransaction' => 'PhabricatorModularTransaction',
|
||||
'PhabricatorProjectTriggerTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorProjectTriggerTransactionType' => 'PhabricatorModularTransactionType',
|
||||
'PhabricatorProjectTriggerUnknownRule' => 'PhabricatorProjectTriggerRule',
|
||||
'PhabricatorProjectTriggerUsage' => 'PhabricatorProjectDAO',
|
||||
'PhabricatorProjectTriggerUsageIndexEngineExtension' => 'PhabricatorIndexEngineExtension',
|
||||
'PhabricatorProjectTriggerViewController' => 'PhabricatorProjectTriggerController',
|
||||
'PhabricatorProjectTypeTransaction' => 'PhabricatorProjectTransactionType',
|
||||
'PhabricatorProjectUIEventListener' => 'PhabricatorEventListener',
|
||||
'PhabricatorProjectUpdateController' => 'PhabricatorProjectController',
|
||||
@@ -10214,6 +10427,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorPygmentSetupCheck' => 'PhabricatorSetupCheck',
|
||||
'PhabricatorQuery' => 'Phobject',
|
||||
'PhabricatorQueryConstraint' => 'Phobject',
|
||||
'PhabricatorQueryCursor' => 'Phobject',
|
||||
'PhabricatorQueryIterator' => 'PhutilBufferedIterator',
|
||||
'PhabricatorQueryOrderItem' => 'Phobject',
|
||||
'PhabricatorQueryOrderTestCase' => 'PhabricatorTestCase',
|
||||
@@ -10836,6 +11050,7 @@ phutil_register_library_map(array(
|
||||
'PhabricatorUnitTestContentSource' => 'PhabricatorContentSource',
|
||||
'PhabricatorUnitsTestCase' => 'PhabricatorTestCase',
|
||||
'PhabricatorUnknownContentSource' => 'PhabricatorContentSource',
|
||||
'PhabricatorUnlockEngine' => 'Phobject',
|
||||
'PhabricatorUnsubscribedFromObjectEdgeType' => 'PhabricatorEdgeType',
|
||||
'PhabricatorUser' => array(
|
||||
'PhabricatorUserDAO',
|
||||
@@ -11232,6 +11447,7 @@ phutil_register_library_map(array(
|
||||
'PhortuneAccountViewController' => 'PhortuneAccountProfileController',
|
||||
'PhortuneAdHocCart' => 'PhortuneCartImplementation',
|
||||
'PhortuneAdHocProduct' => 'PhortuneProductImplementation',
|
||||
'PhortuneAddPaymentMethodAction' => 'PhabricatorSystemAction',
|
||||
'PhortuneCart' => array(
|
||||
'PhortuneDAO',
|
||||
'PhabricatorApplicationTransactionInterface',
|
||||
@@ -11267,6 +11483,7 @@ phutil_register_library_map(array(
|
||||
'PhortuneCurrencySerializer' => 'PhabricatorLiskSerializer',
|
||||
'PhortuneCurrencyTestCase' => 'PhabricatorTestCase',
|
||||
'PhortuneDAO' => 'PhabricatorLiskDAO',
|
||||
'PhortuneDisplayException' => 'Exception',
|
||||
'PhortuneErrCode' => 'PhortuneConstants',
|
||||
'PhortuneInvoiceView' => 'AphrontTagView',
|
||||
'PhortuneLandingController' => 'PhortuneController',
|
||||
|
||||
@@ -591,10 +591,11 @@ final class AphrontRequest extends Phobject {
|
||||
}
|
||||
|
||||
public function getRequestURI() {
|
||||
$get = $_GET;
|
||||
unset($get['__path__']);
|
||||
$path = phutil_escape_uri($this->getPath());
|
||||
return id(new PhutilURI($path))->setQueryParams($get);
|
||||
$uri_path = phutil_escape_uri($this->getPath());
|
||||
$uri_query = idx($_SERVER, 'QUERY_STRING', '');
|
||||
|
||||
return id(new PhutilURI($uri_path.'?'.$uri_query))
|
||||
->removeQueryParam('__path__');
|
||||
}
|
||||
|
||||
public function getAbsoluteRequestURI() {
|
||||
@@ -824,7 +825,10 @@ final class AphrontRequest extends Phobject {
|
||||
}
|
||||
|
||||
$uri->setPath($this->getPath());
|
||||
$uri->setQueryParams(self::flattenData($_GET));
|
||||
$uri->removeAllQueryParams();
|
||||
foreach (self::flattenData($_GET) as $query_key => $query_value) {
|
||||
$uri->appendQueryParam($query_key, $query_value);
|
||||
}
|
||||
|
||||
$input = PhabricatorStartup::getRawInput();
|
||||
|
||||
|
||||
@@ -118,6 +118,12 @@ final class AphrontApplicationConfiguration
|
||||
$database_exception = $ex;
|
||||
}
|
||||
|
||||
// If we're in developer mode, set a flag so that top-level exception
|
||||
// handlers can add more information.
|
||||
if (PhabricatorEnv::getEnvConfig('phabricator.developer-mode')) {
|
||||
$sink->setShowStackTraces(true);
|
||||
}
|
||||
|
||||
if ($database_exception) {
|
||||
$issue = PhabricatorSetupIssue::newDatabaseConnectionIssue(
|
||||
$database_exception,
|
||||
@@ -282,23 +288,69 @@ final class AphrontApplicationConfiguration
|
||||
}
|
||||
} catch (Exception $ex) {
|
||||
$original_exception = $ex;
|
||||
$response = $this->handleThrowable($ex);
|
||||
} catch (Throwable $ex) {
|
||||
$original_exception = $ex;
|
||||
$response = $this->handleThrowable($ex);
|
||||
}
|
||||
|
||||
$response_exception = null;
|
||||
try {
|
||||
if ($original_exception) {
|
||||
$response = $this->handleThrowable($original_exception);
|
||||
}
|
||||
|
||||
$response = $this->produceResponse($request, $response);
|
||||
$response = $controller->willSendResponse($response);
|
||||
$response->setRequest($request);
|
||||
|
||||
self::writeResponse($sink, $response);
|
||||
} catch (Exception $ex) {
|
||||
$response_exception = $ex;
|
||||
} catch (Throwable $ex) {
|
||||
$response_exception = $ex;
|
||||
}
|
||||
|
||||
if ($response_exception) {
|
||||
// If we encountered an exception while building a normal response, then
|
||||
// encountered another exception while building a response for the first
|
||||
// exception, just throw the original exception. It is more likely to be
|
||||
// useful and point at a root cause than the second exception we ran into
|
||||
// while telling the user about it.
|
||||
if ($original_exception) {
|
||||
throw $original_exception;
|
||||
}
|
||||
throw $ex;
|
||||
|
||||
// If we built a response successfully and then ran into an exception
|
||||
// trying to render it, try to handle and present that exception to the
|
||||
// user using the standard handler.
|
||||
|
||||
// The problem here might be in rendering (more common) or in the actual
|
||||
// response mechanism (less common). If it's in rendering, we can likely
|
||||
// still render a nice exception page: the majority of rendering issues
|
||||
// are in main page content, not content shared with the exception page.
|
||||
|
||||
$handling_exception = null;
|
||||
try {
|
||||
$response = $this->handleThrowable($response_exception);
|
||||
|
||||
$response = $this->produceResponse($request, $response);
|
||||
$response = $controller->willSendResponse($response);
|
||||
$response->setRequest($request);
|
||||
|
||||
self::writeResponse($sink, $response);
|
||||
} catch (Exception $ex) {
|
||||
$handling_exception = $ex;
|
||||
} catch (Throwable $ex) {
|
||||
$handling_exception = $ex;
|
||||
}
|
||||
|
||||
// If we didn't have any luck with that, raise the original response
|
||||
// exception. As above, this is the root cause exception and more likely
|
||||
// to be useful. This will go to the fallback error handler at top
|
||||
// level.
|
||||
|
||||
if ($handling_exception) {
|
||||
throw $response_exception;
|
||||
}
|
||||
}
|
||||
|
||||
return $response;
|
||||
@@ -724,7 +776,6 @@ final class AphrontApplicationConfiguration
|
||||
'filler' => str_repeat('Q', 1024 * 16),
|
||||
);
|
||||
|
||||
|
||||
return id(new AphrontJSONResponse())
|
||||
->setAddJSONShield(false)
|
||||
->setContent($result);
|
||||
|
||||
@@ -32,22 +32,21 @@ final class AphrontAjaxResponse extends AphrontResponse {
|
||||
}
|
||||
|
||||
public function buildResponseString() {
|
||||
$request = $this->getRequest();
|
||||
$console = $this->getConsole();
|
||||
if ($console) {
|
||||
// NOTE: We're stripping query parameters here both for readability and
|
||||
// to mitigate BREACH and similar attacks. The parameters are available
|
||||
// in the "Request" tab, so this should not impact usability. See T3684.
|
||||
$uri = $this->getRequest()->getRequestURI();
|
||||
$uri = new PhutilURI($uri);
|
||||
$uri->setQueryParams(array());
|
||||
$path = $request->getPath();
|
||||
|
||||
Javelin::initBehavior(
|
||||
'dark-console',
|
||||
array(
|
||||
'uri' => (string)$uri,
|
||||
'key' => $console->getKey($this->getRequest()),
|
||||
'uri' => $path,
|
||||
'key' => $console->getKey($request),
|
||||
'color' => $console->getColor(),
|
||||
'quicksand' => $this->getRequest()->isQuicksand(),
|
||||
'quicksand' => $request->isQuicksand(),
|
||||
));
|
||||
}
|
||||
|
||||
@@ -60,7 +59,6 @@ final class AphrontAjaxResponse extends AphrontResponse {
|
||||
|
||||
$response = CelerityAPI::getStaticResourceResponse();
|
||||
|
||||
$request = $this->getRequest();
|
||||
if ($request) {
|
||||
$viewer = $request->getViewer();
|
||||
if ($viewer) {
|
||||
|
||||
@@ -218,7 +218,7 @@ abstract class AphrontResponse extends Phobject {
|
||||
$uri = id(new PhutilURI($uri))
|
||||
->setPath(null)
|
||||
->setFragment(null)
|
||||
->setQueryParams(array());
|
||||
->removeAllQueryParams();
|
||||
|
||||
$uri = (string)$uri;
|
||||
if (preg_match('/[ ;\']/', $uri)) {
|
||||
|
||||
@@ -4,8 +4,20 @@ final class AphrontUnhandledExceptionResponse
|
||||
extends AphrontStandaloneHTMLResponse {
|
||||
|
||||
private $exception;
|
||||
private $showStackTraces;
|
||||
|
||||
public function setShowStackTraces($show_stack_traces) {
|
||||
$this->showStackTraces = $show_stack_traces;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getShowStackTraces() {
|
||||
return $this->showStackTraces;
|
||||
}
|
||||
|
||||
public function setException($exception) {
|
||||
// NOTE: We accept an Exception or a Throwable.
|
||||
|
||||
public function setException(Exception $exception) {
|
||||
// Log the exception unless it's specifically a silent malformed request
|
||||
// exception.
|
||||
|
||||
@@ -61,10 +73,36 @@ final class AphrontUnhandledExceptionResponse
|
||||
$body = $ex->getMessage();
|
||||
$body = phutil_escape_html_newlines($body);
|
||||
|
||||
$classes = array();
|
||||
$classes[] = 'unhandled-exception-detail';
|
||||
|
||||
$stack = null;
|
||||
if ($this->getShowStackTraces()) {
|
||||
try {
|
||||
$stack = id(new AphrontStackTraceView())
|
||||
->setTrace($ex->getTrace());
|
||||
|
||||
$stack = hsprintf('%s', $stack);
|
||||
|
||||
$stack = phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'unhandled-exception-stack',
|
||||
),
|
||||
$stack);
|
||||
|
||||
$classes[] = 'unhandled-exception-with-stack';
|
||||
} catch (Exception $trace_exception) {
|
||||
$stack = null;
|
||||
} catch (Throwable $trace_exception) {
|
||||
$stack = null;
|
||||
}
|
||||
}
|
||||
|
||||
return phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'unhandled-exception-detail',
|
||||
'class' => implode(' ', $classes),
|
||||
),
|
||||
array(
|
||||
phutil_tag(
|
||||
@@ -79,6 +117,7 @@ final class AphrontUnhandledExceptionResponse
|
||||
'class' => 'unhandled-exception-body',
|
||||
),
|
||||
$body),
|
||||
$stack,
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
@@ -5,14 +5,22 @@
|
||||
* Normally this is just @{class:AphrontPHPHTTPSink}, which uses "echo" and
|
||||
* "header()" to emit responses.
|
||||
*
|
||||
* Mostly, this class allows us to do install security or metrics hooks in the
|
||||
* output pipeline.
|
||||
*
|
||||
* @task write Writing Response Components
|
||||
* @task emit Emitting the Response
|
||||
*/
|
||||
abstract class AphrontHTTPSink extends Phobject {
|
||||
|
||||
private $showStackTraces = false;
|
||||
|
||||
final public function setShowStackTraces($show_stack_traces) {
|
||||
$this->showStackTraces = $show_stack_traces;
|
||||
return $this;
|
||||
}
|
||||
|
||||
final public function getShowStackTraces() {
|
||||
return $this->showStackTraces;
|
||||
}
|
||||
|
||||
|
||||
/* -( Writing Response Components )---------------------------------------- */
|
||||
|
||||
@@ -103,6 +111,17 @@ abstract class AphrontHTTPSink extends Phobject {
|
||||
// HTTP headers.
|
||||
$data = $response->getContentIterator();
|
||||
|
||||
// This isn't an exceptionally clean separation of concerns, but we need
|
||||
// to add CSP headers for all response types (including both web pages
|
||||
// and dialogs) and can't determine the correct CSP until after we render
|
||||
// the page (because page elements like Recaptcha may add CSP rules).
|
||||
$static = CelerityAPI::getStaticResourceResponse();
|
||||
foreach ($static->getContentSecurityPolicyURIMap() as $kind => $uris) {
|
||||
foreach ($uris as $uri) {
|
||||
$response->addContentSecurityPolicyURI($kind, $uri);
|
||||
}
|
||||
}
|
||||
|
||||
$all_headers = array_merge(
|
||||
$response->getHeaders(),
|
||||
$response->getCacheHeaders());
|
||||
|
||||
@@ -67,19 +67,13 @@ abstract class AlmanacController
|
||||
$is_builtin = isset($builtins[$key]);
|
||||
$is_persistent = (bool)$property->getID();
|
||||
|
||||
$delete_uri = id(new PhutilURI($delete_base))
|
||||
->setQueryParams(
|
||||
array(
|
||||
'key' => $key,
|
||||
'objectPHID' => $object->getPHID(),
|
||||
));
|
||||
$params = array(
|
||||
'key' => $key,
|
||||
'objectPHID' => $object->getPHID(),
|
||||
);
|
||||
|
||||
$edit_uri = id(new PhutilURI($edit_base))
|
||||
->setQueryParams(
|
||||
array(
|
||||
'key' => $key,
|
||||
'objectPHID' => $object->getPHID(),
|
||||
));
|
||||
$delete_uri = new PhutilURI($delete_base, $params);
|
||||
$edit_uri = new PhutilURI($edit_base, $params);
|
||||
|
||||
$delete = javelin_tag(
|
||||
'a',
|
||||
@@ -143,7 +137,7 @@ abstract class AlmanacController
|
||||
|
||||
$phid = $object->getPHID();
|
||||
$add_uri = id(new PhutilURI($edit_base))
|
||||
->setQueryParam('objectPHID', $object->getPHID());
|
||||
->replaceQueryParam('objectPHID', $object->getPHID());
|
||||
|
||||
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
||||
$viewer,
|
||||
|
||||
@@ -122,11 +122,10 @@ final class AlmanacDeviceQuery
|
||||
);
|
||||
}
|
||||
|
||||
protected function getPagingValueMap($cursor, array $keys) {
|
||||
$device = $this->loadCursorObject($cursor);
|
||||
protected function newPagingMapFromPartialObject($object) {
|
||||
return array(
|
||||
'id' => $device->getID(),
|
||||
'name' => $device->getName(),
|
||||
'id' => (int)$object->getID(),
|
||||
'name' => $object->getName(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,16 @@ final class AlmanacInterfaceQuery
|
||||
return $interfaces;
|
||||
}
|
||||
|
||||
protected function buildSelectClauseParts(AphrontDatabaseConnection $conn) {
|
||||
$select = parent::buildSelectClauseParts($conn);
|
||||
|
||||
if ($this->shouldJoinDeviceTable()) {
|
||||
$select[] = qsprintf($conn, 'device.name');
|
||||
}
|
||||
|
||||
return $select;
|
||||
}
|
||||
|
||||
protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
|
||||
$where = parent::buildWhereClauseParts($conn);
|
||||
|
||||
@@ -186,15 +196,16 @@ final class AlmanacInterfaceQuery
|
||||
);
|
||||
}
|
||||
|
||||
protected function getPagingValueMap($cursor, array $keys) {
|
||||
$interface = $this->loadCursorObject($cursor);
|
||||
protected function newPagingMapFromCursorObject(
|
||||
PhabricatorQueryCursor $cursor,
|
||||
array $keys) {
|
||||
|
||||
$map = array(
|
||||
'id' => $interface->getID(),
|
||||
'name' => $interface->getDevice()->getName(),
|
||||
$interface = $cursor->getObject();
|
||||
|
||||
return array(
|
||||
'id' => (int)$interface->getID(),
|
||||
'name' => $cursor->getRawRowProperty('device.name'),
|
||||
);
|
||||
|
||||
return $map;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -79,11 +79,10 @@ final class AlmanacNamespaceQuery
|
||||
);
|
||||
}
|
||||
|
||||
protected function getPagingValueMap($cursor, array $keys) {
|
||||
$namespace = $this->loadCursorObject($cursor);
|
||||
protected function newPagingMapFromPartialObject($object) {
|
||||
return array(
|
||||
'id' => $namespace->getID(),
|
||||
'name' => $namespace->getName(),
|
||||
'id' => (int)$object->getID(),
|
||||
'name' => $object->getName(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -206,11 +206,10 @@ final class AlmanacServiceQuery
|
||||
);
|
||||
}
|
||||
|
||||
protected function getPagingValueMap($cursor, array $keys) {
|
||||
$service = $this->loadCursorObject($cursor);
|
||||
protected function newPagingMapFromPartialObject($object) {
|
||||
return array(
|
||||
'id' => $service->getID(),
|
||||
'name' => $service->getName(),
|
||||
'id' => (int)$object->getID(),
|
||||
'name' => $object->getName(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,8 +7,4 @@ abstract class AlmanacModularTransaction
|
||||
return 'almanac';
|
||||
}
|
||||
|
||||
public function getApplicationTransactionCommentObject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -105,10 +105,10 @@ final class PhabricatorAuditManagementDeleteWorkflow
|
||||
$query->withPHIDs(mpull($commits, 'getPHID'));
|
||||
}
|
||||
|
||||
$commits = $query->execute();
|
||||
$commits = mpull($commits, null, 'getPHID');
|
||||
$commit_iterator = new PhabricatorQueryIterator($query);
|
||||
|
||||
$audits = array();
|
||||
foreach ($commits as $commit) {
|
||||
foreach ($commit_iterator as $commit) {
|
||||
$commit_audits = $commit->getAudits();
|
||||
foreach ($commit_audits as $key => $audit) {
|
||||
if ($id_map && empty($id_map[$audit->getID()])) {
|
||||
@@ -131,51 +131,87 @@ final class PhabricatorAuditManagementDeleteWorkflow
|
||||
continue;
|
||||
}
|
||||
}
|
||||
$audits[] = $commit_audits;
|
||||
}
|
||||
$audits = array_mergev($audits);
|
||||
|
||||
$console = PhutilConsole::getConsole();
|
||||
if (!$commit_audits) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$audits) {
|
||||
$console->writeErr("%s\n", pht('No audits match the query.'));
|
||||
return 0;
|
||||
}
|
||||
$handles = id(new PhabricatorHandleQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs(mpull($commit_audits, 'getAuditorPHID'))
|
||||
->execute();
|
||||
|
||||
$handles = id(new PhabricatorHandleQuery())
|
||||
->setViewer($this->getViewer())
|
||||
->withPHIDs(mpull($audits, 'getAuditorPHID'))
|
||||
->execute();
|
||||
foreach ($commit_audits as $audit) {
|
||||
$audit_id = $audit->getID();
|
||||
|
||||
|
||||
foreach ($audits as $audit) {
|
||||
$commit = $commits[$audit->getCommitPHID()];
|
||||
|
||||
$console->writeOut(
|
||||
"%s\n",
|
||||
sprintf(
|
||||
$description = sprintf(
|
||||
'%10d %-16s %-16s %s: %s',
|
||||
$audit->getID(),
|
||||
$audit_id,
|
||||
$handles[$audit->getAuditorPHID()]->getName(),
|
||||
PhabricatorAuditStatusConstants::getStatusName(
|
||||
$audit->getAuditStatus()),
|
||||
$commit->getRepository()->formatCommitName(
|
||||
$commit->getCommitIdentifier()),
|
||||
trim($commit->getSummary())));
|
||||
trim($commit->getSummary()));
|
||||
|
||||
$audits[] = array(
|
||||
'auditID' => $audit_id,
|
||||
'commitPHID' => $commit->getPHID(),
|
||||
'description' => $description,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$is_dry_run) {
|
||||
$message = pht(
|
||||
'Really delete these %d audit(s)? They will be permanently deleted '.
|
||||
'and can not be recovered.',
|
||||
count($audits));
|
||||
if ($console->confirm($message)) {
|
||||
foreach ($audits as $audit) {
|
||||
$id = $audit->getID();
|
||||
$console->writeOut("%s\n", pht('Deleting audit %d...', $id));
|
||||
$audit->delete();
|
||||
}
|
||||
if (!$audits) {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht('No audits match the query.'));
|
||||
return 0;
|
||||
}
|
||||
|
||||
foreach ($audits as $audit_spec) {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
$audit_spec['description']);
|
||||
}
|
||||
|
||||
if ($is_dry_run) {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht('This is a dry run, so no changes will be made.'));
|
||||
return 0;
|
||||
}
|
||||
|
||||
$message = pht(
|
||||
'Really delete these %s audit(s)? They will be permanently deleted '.
|
||||
'and can not be recovered.',
|
||||
phutil_count($audits));
|
||||
if (!phutil_console_confirm($message)) {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht('User aborted the workflow.'));
|
||||
return 1;
|
||||
}
|
||||
|
||||
$audits_by_commit = igroup($audits, 'commitPHID');
|
||||
foreach ($audits_by_commit as $commit_phid => $audit_specs) {
|
||||
$audit_ids = ipull($audit_specs, 'auditID');
|
||||
|
||||
$audits = id(new PhabricatorRepositoryAuditRequest())->loadAllWhere(
|
||||
'id IN (%Ld)',
|
||||
$audit_ids);
|
||||
|
||||
foreach ($audits as $audit) {
|
||||
$id = $audit->getID();
|
||||
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht('Deleting audit %d...', $id));
|
||||
|
||||
$audit->delete();
|
||||
}
|
||||
|
||||
$this->synchronizeCommitAuditState($commit_phid);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -87,4 +87,39 @@ abstract class PhabricatorAuditManagementWorkflow
|
||||
return $commits;
|
||||
}
|
||||
|
||||
protected function synchronizeCommitAuditState($commit_phid) {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$commit = id(new DiffusionCommitQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs(array($commit_phid))
|
||||
->needAuditRequests(true)
|
||||
->executeOne();
|
||||
if (!$commit) {
|
||||
return;
|
||||
}
|
||||
|
||||
$old_status = $commit->getAuditStatusObject();
|
||||
$commit->updateAuditStatus($commit->getAudits());
|
||||
$new_status = $commit->getAuditStatusObject();
|
||||
|
||||
if ($old_status->getKey() == $new_status->getKey()) {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht(
|
||||
'No synchronization changes for "%s".',
|
||||
$commit->getDisplayName()));
|
||||
} else {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht(
|
||||
'Synchronizing "%s": "%s" -> "%s".',
|
||||
$commit->getDisplayName(),
|
||||
$old_status->getName(),
|
||||
$new_status->getName()));
|
||||
|
||||
$commit->save();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,8 +6,16 @@ final class PhabricatorAuditSynchronizeManagementWorkflow
|
||||
protected function didConstruct() {
|
||||
$this
|
||||
->setName('synchronize')
|
||||
->setExamples('**synchronize** ...')
|
||||
->setSynopsis(pht('Update audit status for commits.'))
|
||||
->setExamples(
|
||||
"**synchronize** __repository__ ...\n".
|
||||
"**synchronize** __commit__ ...\n".
|
||||
"**synchronize** --all")
|
||||
->setSynopsis(
|
||||
pht(
|
||||
'Update commits to make their summary audit state reflect the '.
|
||||
'state of their actual audit requests. This can fix inconsistencies '.
|
||||
'in database state if audit requests have been mangled '.
|
||||
'accidentally (or on purpose).'))
|
||||
->setArguments(
|
||||
array_merge(
|
||||
$this->getCommitConstraintArguments(),
|
||||
@@ -21,36 +29,7 @@ final class PhabricatorAuditSynchronizeManagementWorkflow
|
||||
foreach ($objects as $object) {
|
||||
$commits = $this->loadCommitsForConstraintObject($object);
|
||||
foreach ($commits as $commit) {
|
||||
$commit = id(new DiffusionCommitQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs(array($commit->getPHID()))
|
||||
->needAuditRequests(true)
|
||||
->executeOne();
|
||||
if (!$commit) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$old_status = $commit->getAuditStatusObject();
|
||||
$commit->updateAuditStatus($commit->getAudits());
|
||||
$new_status = $commit->getAuditStatusObject();
|
||||
|
||||
if ($old_status->getKey() == $new_status->getKey()) {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht(
|
||||
'No changes for "%s".',
|
||||
$commit->getDisplayName()));
|
||||
} else {
|
||||
echo tsprintf(
|
||||
"%s\n",
|
||||
pht(
|
||||
'Updating "%s": "%s" -> "%s".',
|
||||
$commit->getDisplayName(),
|
||||
$old_status->getName(),
|
||||
$new_status->getName()));
|
||||
|
||||
$commit->save();
|
||||
}
|
||||
$this->synchronizeCommitAuditState($commit->getPHID());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,10 +48,10 @@ final class PhabricatorAuthApplication extends PhabricatorApplication {
|
||||
'' => 'PhabricatorAuthListController',
|
||||
'config/' => array(
|
||||
'new/' => 'PhabricatorAuthNewController',
|
||||
'new/(?P<className>[^/]+)/' => 'PhabricatorAuthEditController',
|
||||
'edit/(?P<id>\d+)/' => 'PhabricatorAuthEditController',
|
||||
'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorAuthEditController',
|
||||
'(?P<action>enable|disable)/(?P<id>\d+)/'
|
||||
=> 'PhabricatorAuthDisableController',
|
||||
'view/(?P<id>\d+)/' => 'PhabricatorAuthProviderViewController',
|
||||
),
|
||||
'login/(?P<pkey>[^/]+)/(?:(?P<extra>[^/]+)/)?'
|
||||
=> 'PhabricatorAuthLoginController',
|
||||
@@ -61,8 +61,8 @@ final class PhabricatorAuthApplication extends PhabricatorApplication {
|
||||
'start/' => 'PhabricatorAuthStartController',
|
||||
'validate/' => 'PhabricatorAuthValidateController',
|
||||
'finish/' => 'PhabricatorAuthFinishController',
|
||||
'unlink/(?P<pkey>[^/]+)/' => 'PhabricatorAuthUnlinkController',
|
||||
'(?P<action>link|refresh)/(?P<pkey>[^/]+)/'
|
||||
'unlink/(?P<id>\d+)/' => 'PhabricatorAuthUnlinkController',
|
||||
'(?P<action>link|refresh)/(?P<id>\d+)/'
|
||||
=> 'PhabricatorAuthLinkController',
|
||||
'confirmlink/(?P<akey>[^/]+)/'
|
||||
=> 'PhabricatorAuthConfirmLinkController',
|
||||
@@ -86,7 +86,9 @@ final class PhabricatorAuthApplication extends PhabricatorApplication {
|
||||
=> 'PhabricatorAuthSSHKeyRevokeController',
|
||||
'view/(?P<id>\d+)/' => 'PhabricatorAuthSSHKeyViewController',
|
||||
),
|
||||
|
||||
'password/' => 'PhabricatorAuthSetPasswordController',
|
||||
'external/' => 'PhabricatorAuthSetExternalController',
|
||||
|
||||
'mfa/' => array(
|
||||
$this->getQueryRoutePattern() =>
|
||||
@@ -97,6 +99,8 @@ final class PhabricatorAuthApplication extends PhabricatorApplication {
|
||||
'PhabricatorAuthFactorProviderViewController',
|
||||
'message/(?P<id>[1-9]\d*)/' =>
|
||||
'PhabricatorAuthFactorProviderMessageController',
|
||||
'challenge/status/(?P<id>[1-9]\d*)/' =>
|
||||
'PhabricatorAuthChallengeStatusController',
|
||||
),
|
||||
|
||||
'message/' => array(
|
||||
|
||||
@@ -20,7 +20,15 @@ final class PhabricatorAuthConfirmLinkController
|
||||
|
||||
$panel_uri = '/settings/panel/external/';
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
if ($request->isFormOrHisecPost()) {
|
||||
$workflow_key = sprintf(
|
||||
'account.link(%s)',
|
||||
$account->getPHID());
|
||||
|
||||
$hisec_token = id(new PhabricatorAuthSessionEngine())
|
||||
->setWorkflowKey($workflow_key)
|
||||
->requireHighSecurityToken($viewer, $request, $panel_uri);
|
||||
|
||||
$account->setUserPHID($viewer->getPHID());
|
||||
$account->save();
|
||||
|
||||
@@ -31,14 +39,7 @@ final class PhabricatorAuthConfirmLinkController
|
||||
return id(new AphrontRedirectResponse())->setURI($panel_uri);
|
||||
}
|
||||
|
||||
// TODO: Provide more information about the external account. Clicking
|
||||
// through this form blindly is dangerous.
|
||||
|
||||
// TODO: If the user has password authentication, require them to retype
|
||||
// their password here.
|
||||
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($viewer)
|
||||
$dialog = $this->newDialog()
|
||||
->setTitle(pht('Confirm %s Account Link', $provider->getProviderName()))
|
||||
->addCancelButton($panel_uri)
|
||||
->addSubmitButton(pht('Confirm Account Link'));
|
||||
|
||||
@@ -95,7 +95,7 @@ abstract class PhabricatorAuthController extends PhabricatorController {
|
||||
|
||||
private function buildLoginValidateResponse(PhabricatorUser $user) {
|
||||
$validate_uri = new PhutilURI($this->getApplicationURI('validate/'));
|
||||
$validate_uri->setQueryParam('expect', $user->getUsername());
|
||||
$validate_uri->replaceQueryParam('expect', $user->getUsername());
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI((string)$validate_uri);
|
||||
}
|
||||
@@ -213,19 +213,19 @@ abstract class PhabricatorAuthController extends PhabricatorController {
|
||||
return array($account, $provider, $response);
|
||||
}
|
||||
|
||||
$provider = PhabricatorAuthProvider::getEnabledProviderByKey(
|
||||
$account->getProviderKey());
|
||||
|
||||
if (!$provider) {
|
||||
$config = $account->getProviderConfig();
|
||||
if (!$config->getIsEnabled()) {
|
||||
$response = $this->renderError(
|
||||
pht(
|
||||
'The account you are attempting to register with uses a nonexistent '.
|
||||
'or disabled authentication provider (with key "%s"). An '.
|
||||
'administrator may have recently disabled this provider.',
|
||||
$account->getProviderKey()));
|
||||
'The account you are attempting to register with uses a disabled '.
|
||||
'authentication provider ("%s"). An administrator may have '.
|
||||
'recently disabled this provider.',
|
||||
$config->getDisplayName()));
|
||||
return array($account, $provider, $response);
|
||||
}
|
||||
|
||||
$provider = $config->getProvider();
|
||||
|
||||
return array($account, $provider, null);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,14 +6,20 @@ final class PhabricatorAuthLinkController
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$viewer = $this->getViewer();
|
||||
$action = $request->getURIData('action');
|
||||
$provider_key = $request->getURIData('pkey');
|
||||
|
||||
$provider = PhabricatorAuthProvider::getEnabledProviderByKey(
|
||||
$provider_key);
|
||||
if (!$provider) {
|
||||
$id = $request->getURIData('id');
|
||||
|
||||
$config = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs(array($id))
|
||||
->withIsEnabled(true)
|
||||
->executeOne();
|
||||
if (!$config) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
$provider = $config->getProvider();
|
||||
|
||||
switch ($action) {
|
||||
case 'link':
|
||||
if (!$provider->shouldAllowAccountLink()) {
|
||||
@@ -37,15 +43,15 @@ final class PhabricatorAuthLinkController
|
||||
return new Aphront400Response();
|
||||
}
|
||||
|
||||
$account = id(new PhabricatorExternalAccount())->loadOneWhere(
|
||||
'accountType = %s AND accountDomain = %s AND userPHID = %s',
|
||||
$provider->getProviderType(),
|
||||
$provider->getProviderDomain(),
|
||||
$viewer->getPHID());
|
||||
$accounts = id(new PhabricatorExternalAccountQuery())
|
||||
->setViewer($viewer)
|
||||
->withUserPHIDs(array($viewer->getPHID()))
|
||||
->withProviderConfigPHIDs(array($config->getPHID()))
|
||||
->execute();
|
||||
|
||||
switch ($action) {
|
||||
case 'link':
|
||||
if ($account) {
|
||||
if ($accounts) {
|
||||
return $this->renderErrorPage(
|
||||
pht('Account Already Linked'),
|
||||
array(
|
||||
@@ -56,7 +62,7 @@ final class PhabricatorAuthLinkController
|
||||
}
|
||||
break;
|
||||
case 'refresh':
|
||||
if (!$account) {
|
||||
if (!$accounts) {
|
||||
return $this->renderErrorPage(
|
||||
pht('No Account Linked'),
|
||||
array(
|
||||
@@ -76,11 +82,6 @@ final class PhabricatorAuthLinkController
|
||||
|
||||
switch ($action) {
|
||||
case 'link':
|
||||
id(new PhabricatorAuthSessionEngine())->requireHighSecuritySession(
|
||||
$viewer,
|
||||
$request,
|
||||
$panel_uri);
|
||||
|
||||
$form = $provider->buildLinkForm($this);
|
||||
break;
|
||||
case 'refresh':
|
||||
|
||||
@@ -35,6 +35,7 @@ final class PhabricatorAuthLoginController
|
||||
return $response;
|
||||
}
|
||||
|
||||
$invite = $this->loadInvite();
|
||||
$provider = $this->provider;
|
||||
|
||||
try {
|
||||
@@ -103,7 +104,7 @@ final class PhabricatorAuthLoginController
|
||||
// The account is not yet attached to a Phabricator user, so this is
|
||||
// either a registration or an account link request.
|
||||
if (!$viewer->isLoggedIn()) {
|
||||
if ($provider->shouldAllowRegistration()) {
|
||||
if ($provider->shouldAllowRegistration() || $invite) {
|
||||
return $this->processRegisterUser($account);
|
||||
} else {
|
||||
return $this->renderError(
|
||||
|
||||
@@ -14,11 +14,6 @@ final class PhabricatorAuthOneTimeLoginController
|
||||
$key = $request->getURIData('key');
|
||||
$email_id = $request->getURIData('emailID');
|
||||
|
||||
if ($request->getUser()->isLoggedIn()) {
|
||||
return $this->renderError(
|
||||
pht('You are already logged in.'));
|
||||
}
|
||||
|
||||
$target_user = id(new PhabricatorPeopleQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withIDs(array($id))
|
||||
@@ -27,6 +22,19 @@ final class PhabricatorAuthOneTimeLoginController
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
// NOTE: We allow you to use a one-time login link for your own current
|
||||
// login account. This supports the "Set Password" flow.
|
||||
|
||||
$is_logged_in = false;
|
||||
if ($viewer->isLoggedIn()) {
|
||||
if ($viewer->getPHID() !== $target_user->getPHID()) {
|
||||
return $this->renderError(
|
||||
pht('You are already logged in.'));
|
||||
} else {
|
||||
$is_logged_in = true;
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: As a convenience to users, these one-time login URIs may also
|
||||
// be associated with an email address which will be verified when the
|
||||
// URI is used.
|
||||
@@ -100,7 +108,7 @@ final class PhabricatorAuthOneTimeLoginController
|
||||
->addCancelButton('/');
|
||||
}
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
if ($request->isFormPost() || $is_logged_in) {
|
||||
// If we have an email bound into this URI, verify email so that clicking
|
||||
// the link in the "Welcome" email is good enough, without requiring users
|
||||
// to go through a second round of email verification.
|
||||
@@ -119,38 +127,15 @@ final class PhabricatorAuthOneTimeLoginController
|
||||
}
|
||||
unset($unguarded);
|
||||
|
||||
$next = '/';
|
||||
if (!PhabricatorPasswordAuthProvider::getPasswordProvider()) {
|
||||
$next = '/settings/panel/external/';
|
||||
} else {
|
||||
$next_uri = $this->getNextStepURI($target_user);
|
||||
|
||||
// We're going to let the user reset their password without knowing
|
||||
// the old one. Generate a one-time token for that.
|
||||
$key = Filesystem::readRandomCharacters(16);
|
||||
$password_type =
|
||||
PhabricatorAuthPasswordResetTemporaryTokenType::TOKENTYPE;
|
||||
|
||||
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
|
||||
id(new PhabricatorAuthTemporaryToken())
|
||||
->setTokenResource($target_user->getPHID())
|
||||
->setTokenType($password_type)
|
||||
->setTokenExpires(time() + phutil_units('1 hour in seconds'))
|
||||
->setTokenCode(PhabricatorHash::weakDigest($key))
|
||||
->save();
|
||||
unset($unguarded);
|
||||
|
||||
$panel_uri = '/auth/password/';
|
||||
|
||||
$next = (string)id(new PhutilURI($panel_uri))
|
||||
->setQueryParams(
|
||||
array(
|
||||
'key' => $key,
|
||||
));
|
||||
|
||||
$request->setTemporaryCookie(PhabricatorCookies::COOKIE_HISEC, 'yes');
|
||||
// If the user is already logged in, we're just doing a "password set"
|
||||
// flow. Skip directly to the next step.
|
||||
if ($is_logged_in) {
|
||||
return id(new AphrontRedirectResponse())->setURI($next_uri);
|
||||
}
|
||||
|
||||
PhabricatorCookies::setNextURICookie($request, $next, $force = true);
|
||||
PhabricatorCookies::setNextURICookie($request, $next_uri, $force = true);
|
||||
|
||||
$force_full_session = false;
|
||||
if ($link_type === PhabricatorAuthSessionEngine::ONETIME_RECOVER) {
|
||||
@@ -206,4 +191,85 @@ final class PhabricatorAuthOneTimeLoginController
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
}
|
||||
|
||||
private function getNextStepURI(PhabricatorUser $user) {
|
||||
$request = $this->getRequest();
|
||||
|
||||
// If we have password auth, let the user set or reset their password after
|
||||
// login.
|
||||
$have_passwords = PhabricatorPasswordAuthProvider::getPasswordProvider();
|
||||
if ($have_passwords) {
|
||||
// We're going to let the user reset their password without knowing
|
||||
// the old one. Generate a one-time token for that.
|
||||
$key = Filesystem::readRandomCharacters(16);
|
||||
$password_type =
|
||||
PhabricatorAuthPasswordResetTemporaryTokenType::TOKENTYPE;
|
||||
|
||||
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
|
||||
id(new PhabricatorAuthTemporaryToken())
|
||||
->setTokenResource($user->getPHID())
|
||||
->setTokenType($password_type)
|
||||
->setTokenExpires(time() + phutil_units('1 hour in seconds'))
|
||||
->setTokenCode(PhabricatorHash::weakDigest($key))
|
||||
->save();
|
||||
unset($unguarded);
|
||||
|
||||
$panel_uri = '/auth/password/';
|
||||
|
||||
$request->setTemporaryCookie(PhabricatorCookies::COOKIE_HISEC, 'yes');
|
||||
|
||||
$params = array(
|
||||
'key' => $key,
|
||||
);
|
||||
|
||||
return (string)new PhutilURI($panel_uri, $params);
|
||||
}
|
||||
|
||||
// Check if the user already has external accounts linked. If they do,
|
||||
// it's not obvious why they aren't using them to log in, but assume they
|
||||
// know what they're doing. We won't send them to the link workflow.
|
||||
$accounts = id(new PhabricatorExternalAccountQuery())
|
||||
->setViewer($user)
|
||||
->withUserPHIDs(array($user->getPHID()))
|
||||
->execute();
|
||||
|
||||
$configs = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($user)
|
||||
->withIsEnabled(true)
|
||||
->execute();
|
||||
|
||||
$linkable = array();
|
||||
foreach ($configs as $config) {
|
||||
if (!$config->getShouldAllowLink()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$provider = $config->getProvider();
|
||||
if (!$provider->isLoginFormAButton()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$linkable[] = $provider;
|
||||
}
|
||||
|
||||
// If there's at least one linkable provider, and the user doesn't already
|
||||
// have accounts, send the user to the link workflow.
|
||||
if (!$accounts && $linkable) {
|
||||
return '/auth/external/';
|
||||
}
|
||||
|
||||
// If there are no configured providers and the user is an administrator,
|
||||
// send them to Auth to configure a provider. This is probably where they
|
||||
// want to go. You can end up in this state by accidentally losing your
|
||||
// first session during initial setup, or after restoring exported data
|
||||
// from a hosted instance.
|
||||
if (!$configs && $user->getIsAdmin()) {
|
||||
return '/auth/';
|
||||
}
|
||||
|
||||
// If we didn't find anywhere better to send them, give up and just send
|
||||
// them to the home page.
|
||||
return '/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -11,21 +11,25 @@ final class PhabricatorAuthRegisterController
|
||||
$viewer = $this->getViewer();
|
||||
$account_key = $request->getURIData('akey');
|
||||
|
||||
if ($request->getUser()->isLoggedIn()) {
|
||||
if ($viewer->isLoggedIn()) {
|
||||
return id(new AphrontRedirectResponse())->setURI('/');
|
||||
}
|
||||
|
||||
$invite = $this->loadInvite();
|
||||
|
||||
$is_setup = false;
|
||||
if (strlen($account_key)) {
|
||||
$result = $this->loadAccountForRegistrationOrLinking($account_key);
|
||||
list($account, $provider, $response) = $result;
|
||||
$is_default = false;
|
||||
} else if ($this->isFirstTimeSetup()) {
|
||||
list($account, $provider, $response) = $this->loadSetupAccount();
|
||||
$account = null;
|
||||
$provider = null;
|
||||
$response = null;
|
||||
$is_default = true;
|
||||
$is_setup = true;
|
||||
} else {
|
||||
list($account, $provider, $response) = $this->loadDefaultAccount();
|
||||
list($account, $provider, $response) = $this->loadDefaultAccount($invite);
|
||||
$is_default = true;
|
||||
}
|
||||
|
||||
@@ -33,24 +37,24 @@ final class PhabricatorAuthRegisterController
|
||||
return $response;
|
||||
}
|
||||
|
||||
$invite = $this->loadInvite();
|
||||
if (!$is_setup) {
|
||||
if (!$provider->shouldAllowRegistration()) {
|
||||
if ($invite) {
|
||||
// If the user has an invite, we allow them to register with any
|
||||
// provider, even a login-only provider.
|
||||
} else {
|
||||
// TODO: This is a routine error if you click "Login" on an external
|
||||
// auth source which doesn't allow registration. The error should be
|
||||
// more tailored.
|
||||
|
||||
if (!$provider->shouldAllowRegistration()) {
|
||||
if ($invite) {
|
||||
// If the user has an invite, we allow them to register with any
|
||||
// provider, even a login-only provider.
|
||||
} else {
|
||||
// TODO: This is a routine error if you click "Login" on an external
|
||||
// auth source which doesn't allow registration. The error should be
|
||||
// more tailored.
|
||||
|
||||
return $this->renderError(
|
||||
pht(
|
||||
'The account you are attempting to register with uses an '.
|
||||
'authentication provider ("%s") which does not allow '.
|
||||
'registration. An administrator may have recently disabled '.
|
||||
'registration with this provider.',
|
||||
$provider->getProviderName()));
|
||||
return $this->renderError(
|
||||
pht(
|
||||
'The account you are attempting to register with uses an '.
|
||||
'authentication provider ("%s") which does not allow '.
|
||||
'registration. An administrator may have recently disabled '.
|
||||
'registration with this provider.',
|
||||
$provider->getProviderName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,14 +62,19 @@ final class PhabricatorAuthRegisterController
|
||||
|
||||
$user = new PhabricatorUser();
|
||||
|
||||
$default_username = $account->getUsername();
|
||||
$default_realname = $account->getRealName();
|
||||
if ($is_setup) {
|
||||
$default_username = null;
|
||||
$default_realname = null;
|
||||
$default_email = null;
|
||||
} else {
|
||||
$default_username = $account->getUsername();
|
||||
$default_realname = $account->getRealName();
|
||||
$default_email = $account->getEmail();
|
||||
}
|
||||
|
||||
$account_type = PhabricatorAuthPassword::PASSWORD_TYPE_ACCOUNT;
|
||||
$content_source = PhabricatorContentSource::newFromRequest($request);
|
||||
|
||||
$default_email = $account->getEmail();
|
||||
|
||||
if ($invite) {
|
||||
$default_email = $invite->getEmailAddress();
|
||||
}
|
||||
@@ -212,7 +221,11 @@ final class PhabricatorAuthRegisterController
|
||||
$can_edit_email = $profile->getCanEditEmail();
|
||||
$can_edit_realname = $profile->getCanEditRealName();
|
||||
|
||||
$must_set_password = $provider->shouldRequireRegistrationPassword();
|
||||
if ($is_setup) {
|
||||
$must_set_password = false;
|
||||
} else {
|
||||
$must_set_password = $provider->shouldRequireRegistrationPassword();
|
||||
}
|
||||
|
||||
$can_edit_anything = $profile->getCanEditAnything() || $must_set_password;
|
||||
$force_verify = $profile->getShouldVerifyEmail();
|
||||
@@ -342,9 +355,11 @@ final class PhabricatorAuthRegisterController
|
||||
}
|
||||
|
||||
if (!$errors) {
|
||||
$image = $this->loadProfilePicture($account);
|
||||
if ($image) {
|
||||
$user->setProfileImagePHID($image->getPHID());
|
||||
if (!$is_setup) {
|
||||
$image = $this->loadProfilePicture($account);
|
||||
if ($image) {
|
||||
$user->setProfileImagePHID($image->getPHID());
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -354,17 +369,19 @@ final class PhabricatorAuthRegisterController
|
||||
$verify_email = true;
|
||||
}
|
||||
|
||||
if ($value_email === $default_email) {
|
||||
if ($account->getEmailVerified()) {
|
||||
$verify_email = true;
|
||||
}
|
||||
if (!$is_setup) {
|
||||
if ($value_email === $default_email) {
|
||||
if ($account->getEmailVerified()) {
|
||||
$verify_email = true;
|
||||
}
|
||||
|
||||
if ($provider->shouldTrustEmails()) {
|
||||
$verify_email = true;
|
||||
}
|
||||
if ($provider->shouldTrustEmails()) {
|
||||
$verify_email = true;
|
||||
}
|
||||
|
||||
if ($invite) {
|
||||
$verify_email = true;
|
||||
if ($invite) {
|
||||
$verify_email = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -446,9 +463,11 @@ final class PhabricatorAuthRegisterController
|
||||
$transaction_editor->applyTransactions($user, $xactions);
|
||||
}
|
||||
|
||||
$account->setUserPHID($user->getPHID());
|
||||
$provider->willRegisterAccount($account);
|
||||
$account->save();
|
||||
if (!$is_setup) {
|
||||
$account->setUserPHID($user->getPHID());
|
||||
$provider->willRegisterAccount($account);
|
||||
$account->save();
|
||||
}
|
||||
|
||||
$user->saveTransaction();
|
||||
|
||||
@@ -509,7 +528,6 @@ final class PhabricatorAuthRegisterController
|
||||
->setAuthProvider($provider)));
|
||||
}
|
||||
|
||||
|
||||
if ($can_edit_username) {
|
||||
$form->appendChild(
|
||||
id(new AphrontFormTextControl())
|
||||
@@ -603,7 +621,7 @@ final class PhabricatorAuthRegisterController
|
||||
pht(
|
||||
'Installation is complete. Register your administrator account '.
|
||||
'below to log in. You will be able to configure options and add '.
|
||||
'other authentication mechanisms (like LDAP or OAuth) later on.'));
|
||||
'authentication mechanisms later on.'));
|
||||
}
|
||||
|
||||
$object_box = id(new PHUIObjectBoxView())
|
||||
@@ -620,11 +638,12 @@ final class PhabricatorAuthRegisterController
|
||||
|
||||
$view = id(new PHUITwoColumnView())
|
||||
->setHeader($header)
|
||||
->setFooter(array(
|
||||
$welcome_view,
|
||||
$invite_header,
|
||||
$object_box,
|
||||
));
|
||||
->setFooter(
|
||||
array(
|
||||
$welcome_view,
|
||||
$invite_header,
|
||||
$object_box,
|
||||
));
|
||||
|
||||
return $this->newPage()
|
||||
->setTitle($title)
|
||||
@@ -632,17 +651,20 @@ final class PhabricatorAuthRegisterController
|
||||
->appendChild($view);
|
||||
}
|
||||
|
||||
private function loadDefaultAccount() {
|
||||
private function loadDefaultAccount($invite) {
|
||||
$providers = PhabricatorAuthProvider::getAllEnabledProviders();
|
||||
$account = null;
|
||||
$provider = null;
|
||||
$response = null;
|
||||
|
||||
foreach ($providers as $key => $candidate_provider) {
|
||||
if (!$candidate_provider->shouldAllowRegistration()) {
|
||||
unset($providers[$key]);
|
||||
continue;
|
||||
if (!$invite) {
|
||||
if (!$candidate_provider->shouldAllowRegistration()) {
|
||||
unset($providers[$key]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$candidate_provider->isDefaultRegistrationProvider()) {
|
||||
unset($providers[$key]);
|
||||
}
|
||||
@@ -660,24 +682,11 @@ final class PhabricatorAuthRegisterController
|
||||
}
|
||||
|
||||
$provider = head($providers);
|
||||
$account = $provider->getDefaultExternalAccount();
|
||||
$account = $provider->newDefaultExternalAccount();
|
||||
|
||||
return array($account, $provider, $response);
|
||||
}
|
||||
|
||||
private function loadSetupAccount() {
|
||||
$provider = new PhabricatorPasswordAuthProvider();
|
||||
$provider->attachProviderConfig(
|
||||
id(new PhabricatorAuthProviderConfig())
|
||||
->setShouldAllowRegistration(1)
|
||||
->setShouldAllowLogin(1)
|
||||
->setIsEnabled(true));
|
||||
|
||||
$account = $provider->getDefaultExternalAccount();
|
||||
$response = null;
|
||||
return array($account, $provider, $response);
|
||||
}
|
||||
|
||||
private function loadProfilePicture(PhabricatorExternalAccount $account) {
|
||||
$phid = $account->getProfileImagePHID();
|
||||
if (!$phid) {
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
|
||||
final class PhabricatorAuthSetExternalController
|
||||
extends PhabricatorAuthController {
|
||||
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$configs = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->withIsEnabled(true)
|
||||
->execute();
|
||||
|
||||
$linkable = array();
|
||||
foreach ($configs as $config) {
|
||||
if (!$config->getShouldAllowLink()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// For now, only buttons get to appear here: for example, we can't
|
||||
// reasonably embed an entire LDAP form into this UI.
|
||||
$provider = $config->getProvider();
|
||||
if (!$provider->isLoginFormAButton()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$linkable[] = $config;
|
||||
}
|
||||
|
||||
if (!$linkable) {
|
||||
return $this->newDialog()
|
||||
->setTitle(pht('No Linkable External Providers'))
|
||||
->appendParagraph(
|
||||
pht(
|
||||
'Currently, there are no configured external auth providers '.
|
||||
'which you can link your account to.'))
|
||||
->addCancelButton('/');
|
||||
}
|
||||
|
||||
$text = PhabricatorAuthMessage::loadMessageText(
|
||||
$viewer,
|
||||
PhabricatorAuthLinkMessageType::MESSAGEKEY);
|
||||
if (!strlen($text)) {
|
||||
$text = pht(
|
||||
'You can link your Phabricator account to an external account to '.
|
||||
'allow you to log in more easily in the future. To continue, choose '.
|
||||
'an account to link below. If you prefer not to link your account, '.
|
||||
'you can skip this step.');
|
||||
}
|
||||
|
||||
$remarkup_view = new PHUIRemarkupView($viewer, $text);
|
||||
$remarkup_view = phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'phui-object-box-instructions',
|
||||
),
|
||||
$remarkup_view);
|
||||
|
||||
PhabricatorCookies::setClientIDCookie($request);
|
||||
|
||||
$view = array();
|
||||
foreach ($configs as $config) {
|
||||
$provider = $config->getProvider();
|
||||
|
||||
$form = $provider->buildLinkForm($this);
|
||||
|
||||
if ($provider->isLoginFormAButton()) {
|
||||
require_celerity_resource('auth-css');
|
||||
$form = phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'phabricator-link-button pl',
|
||||
),
|
||||
$form);
|
||||
}
|
||||
|
||||
$view[] = $form;
|
||||
}
|
||||
|
||||
$form = id(new AphrontFormView())
|
||||
->setViewer($viewer)
|
||||
->appendControl(
|
||||
id(new AphrontFormSubmitControl())
|
||||
->addCancelButton('/', pht('Skip This Step')));
|
||||
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader(pht('Link External Account'));
|
||||
|
||||
$box = id(new PHUIObjectBoxView())
|
||||
->setViewer($viewer)
|
||||
->setHeader($header)
|
||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||
->appendChild($remarkup_view)
|
||||
->appendChild($view)
|
||||
->appendChild($form);
|
||||
|
||||
$main_view = id(new PHUITwoColumnView())
|
||||
->setFooter($box);
|
||||
|
||||
$crumbs = $this->buildApplicationCrumbs()
|
||||
->addTextCrumb(pht('Link External Account'))
|
||||
->setBorder(true);
|
||||
|
||||
return $this->newPage()
|
||||
->setTitle(pht('Link External Account'))
|
||||
->setCrumbs($crumbs)
|
||||
->appendChild($main_view);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -54,7 +54,7 @@ final class PhabricatorAuthStartController
|
||||
}
|
||||
|
||||
$redirect_uri = $request->getRequestURI();
|
||||
$redirect_uri->setQueryParam('cleared', 1);
|
||||
$redirect_uri->replaceQueryParam('cleared', 1);
|
||||
return id(new AphrontRedirectResponse())->setURI($redirect_uri);
|
||||
}
|
||||
}
|
||||
@@ -64,7 +64,7 @@ final class PhabricatorAuthStartController
|
||||
// the workflow will continue normally.
|
||||
if ($did_clear) {
|
||||
$redirect_uri = $request->getRequestURI();
|
||||
$redirect_uri->setQueryParam('cleared', null);
|
||||
$redirect_uri->removeQueryParam('cleared');
|
||||
return id(new AphrontRedirectResponse())->setURI($redirect_uri);
|
||||
}
|
||||
|
||||
@@ -75,6 +75,11 @@ final class PhabricatorAuthStartController
|
||||
}
|
||||
}
|
||||
|
||||
$configs = array();
|
||||
foreach ($providers as $provider) {
|
||||
$configs[] = $provider->getProviderConfig();
|
||||
}
|
||||
|
||||
if (!$providers) {
|
||||
if ($this->isFirstTimeSetup()) {
|
||||
// If this is a fresh install, let the user register their admin
|
||||
@@ -172,23 +177,6 @@ final class PhabricatorAuthStartController
|
||||
$button_columns);
|
||||
}
|
||||
|
||||
$handlers = PhabricatorAuthLoginHandler::getAllHandlers();
|
||||
|
||||
$delegating_controller = $this->getDelegatingController();
|
||||
|
||||
$header = array();
|
||||
foreach ($handlers as $handler) {
|
||||
$handler = clone $handler;
|
||||
|
||||
$handler->setRequest($request);
|
||||
|
||||
if ($delegating_controller) {
|
||||
$handler->setDelegatingController($delegating_controller);
|
||||
}
|
||||
|
||||
$header[] = $handler->getAuthLoginHeaderContent();
|
||||
}
|
||||
|
||||
$invite_message = null;
|
||||
if ($invite) {
|
||||
$invite_message = $this->renderInviteHeader($invite);
|
||||
@@ -196,16 +184,18 @@ final class PhabricatorAuthStartController
|
||||
|
||||
$custom_message = $this->newCustomStartMessage();
|
||||
|
||||
$email_login = $this->newEmailLoginView($configs);
|
||||
|
||||
$crumbs = $this->buildApplicationCrumbs();
|
||||
$crumbs->addTextCrumb(pht('Login'));
|
||||
$crumbs->setBorder(true);
|
||||
|
||||
$title = pht('Login');
|
||||
$view = array(
|
||||
$header,
|
||||
$invite_message,
|
||||
$custom_message,
|
||||
$out,
|
||||
$email_login,
|
||||
);
|
||||
|
||||
return $this->newPage()
|
||||
@@ -329,4 +319,43 @@ final class PhabricatorAuthStartController
|
||||
$remarkup_view);
|
||||
}
|
||||
|
||||
private function newEmailLoginView(array $configs) {
|
||||
assert_instances_of($configs, 'PhabricatorAuthProviderConfig');
|
||||
|
||||
// Check if password auth is enabled. If it is, the password login form
|
||||
// renders a "Forgot password?" link, so we don't need to provide a
|
||||
// supplemental link.
|
||||
|
||||
$has_password = false;
|
||||
foreach ($configs as $config) {
|
||||
$provider = $config->getProvider();
|
||||
if ($provider instanceof PhabricatorPasswordAuthProvider) {
|
||||
$has_password = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($has_password) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$view = array(
|
||||
pht('Trouble logging in?'),
|
||||
' ',
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => '/login/email/',
|
||||
),
|
||||
pht('Send a login link to your email address.')),
|
||||
);
|
||||
|
||||
return phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'auth-custom-message',
|
||||
),
|
||||
$view);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -3,41 +3,45 @@
|
||||
final class PhabricatorAuthUnlinkController
|
||||
extends PhabricatorAuthController {
|
||||
|
||||
private $providerKey;
|
||||
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$viewer = $this->getViewer();
|
||||
$this->providerKey = $request->getURIData('pkey');
|
||||
$id = $request->getURIData('id');
|
||||
|
||||
list($type, $domain) = explode(':', $this->providerKey, 2);
|
||||
|
||||
// Check that this account link actually exists. We don't require the
|
||||
// provider to exist because we want users to be able to delete links to
|
||||
// dead accounts if they want.
|
||||
$account = id(new PhabricatorExternalAccount())->loadOneWhere(
|
||||
'accountType = %s AND accountDomain = %s AND userPHID = %s',
|
||||
$type,
|
||||
$domain,
|
||||
$viewer->getPHID());
|
||||
$account = id(new PhabricatorExternalAccountQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs(array($id))
|
||||
->requireCapabilities(
|
||||
array(
|
||||
PhabricatorPolicyCapability::CAN_VIEW,
|
||||
PhabricatorPolicyCapability::CAN_EDIT,
|
||||
))
|
||||
->executeOne();
|
||||
if (!$account) {
|
||||
return $this->renderNoAccountErrorDialog();
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
// Check that the provider (if it exists) allows accounts to be unlinked.
|
||||
$provider_key = $this->providerKey;
|
||||
$provider = PhabricatorAuthProvider::getEnabledProviderByKey($provider_key);
|
||||
if ($provider) {
|
||||
if (!$provider->shouldAllowAccountUnlink()) {
|
||||
return $this->renderNotUnlinkableErrorDialog($provider);
|
||||
}
|
||||
$done_uri = '/settings/panel/external/';
|
||||
|
||||
$config = $account->getProviderConfig();
|
||||
$provider = $config->getProvider();
|
||||
if (!$provider->shouldAllowAccountUnlink()) {
|
||||
return $this->renderNotUnlinkableErrorDialog($provider, $done_uri);
|
||||
}
|
||||
|
||||
// Check that this account isn't the last account which can be used to
|
||||
// login. We prevent you from removing the last account.
|
||||
$confirmations = $request->getStrList('confirmations');
|
||||
$confirmations = array_fuse($confirmations);
|
||||
|
||||
if (!$request->isFormOrHisecPost() || !isset($confirmations['unlink'])) {
|
||||
return $this->renderConfirmDialog($confirmations, $config, $done_uri);
|
||||
}
|
||||
|
||||
// Check that this account isn't the only account which can be used to
|
||||
// login. We warn you when you remove your only login account.
|
||||
if ($account->isUsableForLogin()) {
|
||||
$other_accounts = id(new PhabricatorExternalAccount())->loadAllWhere(
|
||||
'userPHID = %s',
|
||||
$viewer->getPHID());
|
||||
$other_accounts = id(new PhabricatorExternalAccountQuery())
|
||||
->setViewer($viewer)
|
||||
->withUserPHIDs(array($viewer->getPHID()))
|
||||
->execute();
|
||||
|
||||
$valid_accounts = 0;
|
||||
foreach ($other_accounts as $other_account) {
|
||||
@@ -47,100 +51,91 @@ final class PhabricatorAuthUnlinkController
|
||||
}
|
||||
|
||||
if ($valid_accounts < 2) {
|
||||
return $this->renderLastUsableAccountErrorDialog();
|
||||
if (!isset($confirmations['only'])) {
|
||||
return $this->renderOnlyUsableAccountConfirmDialog(
|
||||
$confirmations,
|
||||
$done_uri);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($request->isDialogFormPost()) {
|
||||
$account->delete();
|
||||
$workflow_key = sprintf(
|
||||
'account.unlink(%s)',
|
||||
$account->getPHID());
|
||||
|
||||
id(new PhabricatorAuthSessionEngine())->terminateLoginSessions(
|
||||
$viewer,
|
||||
new PhutilOpaqueEnvelope(
|
||||
$request->getCookie(PhabricatorCookies::COOKIE_SESSION)));
|
||||
$hisec_token = id(new PhabricatorAuthSessionEngine())
|
||||
->setWorkflowKey($workflow_key)
|
||||
->requireHighSecurityToken($viewer, $request, $done_uri);
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI($this->getDoneURI());
|
||||
}
|
||||
$account->delete();
|
||||
|
||||
return $this->renderConfirmDialog();
|
||||
}
|
||||
id(new PhabricatorAuthSessionEngine())->terminateLoginSessions(
|
||||
$viewer,
|
||||
new PhutilOpaqueEnvelope(
|
||||
$request->getCookie(PhabricatorCookies::COOKIE_SESSION)));
|
||||
|
||||
private function getDoneURI() {
|
||||
return '/settings/panel/external/';
|
||||
}
|
||||
|
||||
private function renderNoAccountErrorDialog() {
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($this->getRequest()->getUser())
|
||||
->setTitle(pht('No Such Account'))
|
||||
->appendChild(
|
||||
pht(
|
||||
'You can not unlink this account because it is not linked.'))
|
||||
->addCancelButton($this->getDoneURI());
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
return id(new AphrontRedirectResponse())->setURI($done_uri);
|
||||
}
|
||||
|
||||
private function renderNotUnlinkableErrorDialog(
|
||||
PhabricatorAuthProvider $provider) {
|
||||
PhabricatorAuthProvider $provider,
|
||||
$done_uri) {
|
||||
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($this->getRequest()->getUser())
|
||||
return $this->newDialog()
|
||||
->setTitle(pht('Permanent Account Link'))
|
||||
->appendChild(
|
||||
pht(
|
||||
'You can not unlink this account because the administrator has '.
|
||||
'configured Phabricator to make links to %s accounts permanent.',
|
||||
'configured Phabricator to make links to "%s" accounts permanent.',
|
||||
$provider->getProviderName()))
|
||||
->addCancelButton($this->getDoneURI());
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
->addCancelButton($done_uri);
|
||||
}
|
||||
|
||||
private function renderLastUsableAccountErrorDialog() {
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($this->getRequest()->getUser())
|
||||
->setTitle(pht('Last Valid Account'))
|
||||
->appendChild(
|
||||
private function renderOnlyUsableAccountConfirmDialog(
|
||||
array $confirmations,
|
||||
$done_uri) {
|
||||
|
||||
$confirmations[] = 'only';
|
||||
|
||||
return $this->newDialog()
|
||||
->setTitle(pht('Unlink Your Only Login Account?'))
|
||||
->addHiddenInput('confirmations', implode(',', $confirmations))
|
||||
->appendParagraph(
|
||||
pht(
|
||||
'You can not unlink this account because you have no other '.
|
||||
'valid login accounts. If you removed it, you would be unable '.
|
||||
'to log in. Add another authentication method before removing '.
|
||||
'this one.'))
|
||||
->addCancelButton($this->getDoneURI());
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
'This is the only external login account linked to your Phabicator '.
|
||||
'account. If you remove it, you may no longer be able to log in.'))
|
||||
->appendParagraph(
|
||||
pht(
|
||||
'If you lose access to your account, you can recover access by '.
|
||||
'sending yourself an email login link from the login screen.'))
|
||||
->addCancelButton($done_uri)
|
||||
->addSubmitButton(pht('Unlink External Account'));
|
||||
}
|
||||
|
||||
private function renderConfirmDialog() {
|
||||
$provider_key = $this->providerKey;
|
||||
$provider = PhabricatorAuthProvider::getEnabledProviderByKey($provider_key);
|
||||
private function renderConfirmDialog(
|
||||
array $confirmations,
|
||||
PhabricatorAuthProviderConfig $config,
|
||||
$done_uri) {
|
||||
|
||||
if ($provider) {
|
||||
$title = pht('Unlink "%s" Account?', $provider->getProviderName());
|
||||
$body = pht(
|
||||
'You will no longer be able to use your %s account to '.
|
||||
'log in to Phabricator.',
|
||||
$provider->getProviderName());
|
||||
} else {
|
||||
$title = pht('Unlink Account?');
|
||||
$body = pht(
|
||||
'You will no longer be able to use this account to log in '.
|
||||
'to Phabricator.');
|
||||
}
|
||||
$confirmations[] = 'unlink';
|
||||
$provider = $config->getProvider();
|
||||
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($this->getRequest()->getUser())
|
||||
$title = pht('Unlink "%s" Account?', $provider->getProviderName());
|
||||
$body = pht(
|
||||
'You will no longer be able to use your %s account to '.
|
||||
'log in to Phabricator.',
|
||||
$provider->getProviderName());
|
||||
|
||||
return $this->newDialog()
|
||||
->setTitle($title)
|
||||
->addHiddenInput('confirmations', implode(',', $confirmations))
|
||||
->appendParagraph($body)
|
||||
->appendParagraph(
|
||||
pht(
|
||||
'Note: Unlinking an authentication provider will terminate any '.
|
||||
'other active login sessions.'))
|
||||
->addSubmitButton(pht('Unlink Account'))
|
||||
->addCancelButton($this->getDoneURI());
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
->addCancelButton($done_uri);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -8,29 +8,42 @@ final class PhabricatorEmailLoginController
|
||||
}
|
||||
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
|
||||
if (!PhabricatorPasswordAuthProvider::getPasswordProvider()) {
|
||||
return new Aphront400Response();
|
||||
}
|
||||
$viewer = $this->getViewer();
|
||||
$is_logged_in = $viewer->isLoggedIn();
|
||||
|
||||
$e_email = true;
|
||||
$e_captcha = true;
|
||||
$errors = array();
|
||||
|
||||
$is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
|
||||
if ($is_logged_in) {
|
||||
if (!$this->isPasswordAuthEnabled()) {
|
||||
return $this->newDialog()
|
||||
->setTitle(pht('No Password Auth'))
|
||||
->appendParagraph(
|
||||
pht(
|
||||
'Password authentication is not enabled and you are already '.
|
||||
'logged in. There is nothing for you here.'))
|
||||
->addCancelButton('/', pht('Continue'));
|
||||
}
|
||||
|
||||
$v_email = $viewer->loadPrimaryEmailAddress();
|
||||
} else {
|
||||
$v_email = $request->getStr('email');
|
||||
}
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$e_email = null;
|
||||
$e_captcha = pht('Again');
|
||||
|
||||
$captcha_ok = AphrontFormRecaptchaControl::processCaptcha($request);
|
||||
if (!$captcha_ok) {
|
||||
$errors[] = pht('Captcha response is incorrect, try again.');
|
||||
$e_captcha = pht('Invalid');
|
||||
if (!$is_logged_in) {
|
||||
$captcha_ok = AphrontFormRecaptchaControl::processCaptcha($request);
|
||||
if (!$captcha_ok) {
|
||||
$errors[] = pht('Captcha response is incorrect, try again.');
|
||||
$e_captcha = pht('Invalid');
|
||||
}
|
||||
}
|
||||
|
||||
$email = $request->getStr('email');
|
||||
if (!strlen($email)) {
|
||||
if (!strlen($v_email)) {
|
||||
$errors[] = pht('You must provide an email address.');
|
||||
$e_email = pht('Required');
|
||||
}
|
||||
@@ -42,7 +55,7 @@ final class PhabricatorEmailLoginController
|
||||
|
||||
$target_email = id(new PhabricatorUserEmail())->loadOneWhere(
|
||||
'address = %s',
|
||||
$email);
|
||||
$v_email);
|
||||
|
||||
$target_user = null;
|
||||
if ($target_email) {
|
||||
@@ -81,33 +94,24 @@ final class PhabricatorEmailLoginController
|
||||
}
|
||||
|
||||
if (!$errors) {
|
||||
$engine = new PhabricatorAuthSessionEngine();
|
||||
$uri = $engine->getOneTimeLoginURI(
|
||||
$body = $this->newAccountLoginMailBody(
|
||||
$target_user,
|
||||
null,
|
||||
PhabricatorAuthSessionEngine::ONETIME_RESET);
|
||||
$is_logged_in);
|
||||
|
||||
if ($is_serious) {
|
||||
$body = pht(
|
||||
"You can use this link to reset your Phabricator password:".
|
||||
"\n\n %s\n",
|
||||
$uri);
|
||||
if ($is_logged_in) {
|
||||
$subject = pht('[Phabricator] Account Password Link');
|
||||
$instructions = pht(
|
||||
'An email has been sent containing a link you can use to set '.
|
||||
'a password for your account.');
|
||||
} else {
|
||||
$body = pht(
|
||||
"Condolences on forgetting your password. You can use this ".
|
||||
"link to reset it:\n\n".
|
||||
" %s\n\n".
|
||||
"After you set a new password, consider writing it down on a ".
|
||||
"sticky note and attaching it to your monitor so you don't ".
|
||||
"forget again! Choosing a very short, easy-to-remember password ".
|
||||
"like \"cat\" or \"1234\" might also help.\n\n".
|
||||
"Best Wishes,\nPhabricator\n",
|
||||
$uri);
|
||||
|
||||
$subject = pht('[Phabricator] Account Login Link');
|
||||
$instructions = pht(
|
||||
'An email has been sent containing a link you can use to log '.
|
||||
'in to your account.');
|
||||
}
|
||||
|
||||
$mail = id(new PhabricatorMetaMTAMail())
|
||||
->setSubject(pht('[Phabricator] Password Reset'))
|
||||
->setSubject($subject)
|
||||
->setForceDelivery(true)
|
||||
->addRawTos(array($target_email->getAddress()))
|
||||
->setBody($body)
|
||||
@@ -116,51 +120,118 @@ final class PhabricatorEmailLoginController
|
||||
return $this->newDialog()
|
||||
->setTitle(pht('Check Your Email'))
|
||||
->setShortTitle(pht('Email Sent'))
|
||||
->appendParagraph(
|
||||
pht('An email has been sent with a link you can use to log in.'))
|
||||
->appendParagraph($instructions)
|
||||
->addCancelButton('/', pht('Done'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$error_view = null;
|
||||
if ($errors) {
|
||||
$error_view = new PHUIInfoView();
|
||||
$error_view->setErrors($errors);
|
||||
$form = id(new AphrontFormView())
|
||||
->setViewer($viewer);
|
||||
|
||||
if ($this->isPasswordAuthEnabled()) {
|
||||
if ($is_logged_in) {
|
||||
$title = pht('Set Password');
|
||||
$form->appendRemarkupInstructions(
|
||||
pht(
|
||||
'A password reset link will be sent to your primary email '.
|
||||
'address. Follow the link to set an account password.'));
|
||||
} else {
|
||||
$title = pht('Password Reset');
|
||||
$form->appendRemarkupInstructions(
|
||||
pht(
|
||||
'To reset your password, provide your email address. An email '.
|
||||
'with a login link will be sent to you.'));
|
||||
}
|
||||
} else {
|
||||
$title = pht('Email Login');
|
||||
$form->appendRemarkupInstructions(
|
||||
pht(
|
||||
'To access your account, provide your email address. An email '.
|
||||
'with a login link will be sent to you.'));
|
||||
}
|
||||
|
||||
$email_auth = new PHUIFormLayoutView();
|
||||
$email_auth->appendChild($error_view);
|
||||
$email_auth
|
||||
->setUser($request->getUser())
|
||||
->setFullWidth(true)
|
||||
->appendChild(
|
||||
id(new AphrontFormTextControl())
|
||||
->setLabel(pht('Email'))
|
||||
->setName('email')
|
||||
->setValue($request->getStr('email'))
|
||||
->setError($e_email))
|
||||
->appendChild(
|
||||
if ($is_logged_in) {
|
||||
$address_control = new AphrontFormStaticControl();
|
||||
} else {
|
||||
$address_control = id(new AphrontFormTextControl())
|
||||
->setName('email')
|
||||
->setError($e_email);
|
||||
}
|
||||
|
||||
$address_control
|
||||
->setLabel(pht('Email Address'))
|
||||
->setValue($v_email);
|
||||
|
||||
$form
|
||||
->appendControl($address_control);
|
||||
|
||||
if (!$is_logged_in) {
|
||||
$form->appendControl(
|
||||
id(new AphrontFormRecaptchaControl())
|
||||
->setLabel(pht('Captcha'))
|
||||
->setError($e_captcha));
|
||||
}
|
||||
|
||||
$crumbs = $this->buildApplicationCrumbs();
|
||||
$crumbs->addTextCrumb(pht('Reset Password'));
|
||||
$crumbs->setBorder(true);
|
||||
|
||||
$dialog = new AphrontDialogView();
|
||||
$dialog->setUser($request->getUser());
|
||||
$dialog->setTitle(pht('Forgot Password / Email Login'));
|
||||
$dialog->appendChild($email_auth);
|
||||
$dialog->addSubmitButton(pht('Send Email'));
|
||||
$dialog->setSubmitURI('/login/email/');
|
||||
|
||||
return $this->newPage()
|
||||
->setTitle(pht('Forgot Password'))
|
||||
->setCrumbs($crumbs)
|
||||
->appendChild($dialog);
|
||||
|
||||
return $this->newDialog()
|
||||
->setTitle($title)
|
||||
->setErrors($errors)
|
||||
->setWidth(AphrontDialogView::WIDTH_FORM)
|
||||
->appendForm($form)
|
||||
->addCancelButton('/auth/start/')
|
||||
->addSubmitButton(pht('Send Email'));
|
||||
}
|
||||
|
||||
private function newAccountLoginMailBody(
|
||||
PhabricatorUser $user,
|
||||
$is_logged_in) {
|
||||
|
||||
$engine = new PhabricatorAuthSessionEngine();
|
||||
$uri = $engine->getOneTimeLoginURI(
|
||||
$user,
|
||||
null,
|
||||
PhabricatorAuthSessionEngine::ONETIME_RESET);
|
||||
|
||||
$is_serious = PhabricatorEnv::getEnvConfig('phabricator.serious-business');
|
||||
$have_passwords = $this->isPasswordAuthEnabled();
|
||||
|
||||
if ($have_passwords) {
|
||||
if ($is_logged_in) {
|
||||
$body = pht(
|
||||
'You can use this link to set a password on your account:'.
|
||||
"\n\n %s\n",
|
||||
$uri);
|
||||
} else if ($is_serious) {
|
||||
$body = pht(
|
||||
"You can use this link to reset your Phabricator password:".
|
||||
"\n\n %s\n",
|
||||
$uri);
|
||||
} else {
|
||||
$body = pht(
|
||||
"Condolences on forgetting your password. You can use this ".
|
||||
"link to reset it:\n\n".
|
||||
" %s\n\n".
|
||||
"After you set a new password, consider writing it down on a ".
|
||||
"sticky note and attaching it to your monitor so you don't ".
|
||||
"forget again! Choosing a very short, easy-to-remember password ".
|
||||
"like \"cat\" or \"1234\" might also help.\n\n".
|
||||
"Best Wishes,\nPhabricator\n",
|
||||
$uri);
|
||||
|
||||
}
|
||||
} else {
|
||||
$body = pht(
|
||||
"You can use this login link to regain access to your Phabricator ".
|
||||
"account:".
|
||||
"\n\n".
|
||||
" %s\n",
|
||||
$uri);
|
||||
}
|
||||
|
||||
return $body;
|
||||
}
|
||||
|
||||
private function isPasswordAuthEnabled() {
|
||||
return (bool)PhabricatorPasswordAuthProvider::getPasswordProvider();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,8 @@ final class PhabricatorAuthDisableController
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$this->requireApplicationCapability(
|
||||
AuthManageProvidersCapability::CAPABILITY);
|
||||
$viewer = $request->getUser();
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
$config_id = $request->getURIData('id');
|
||||
$action = $request->getURIData('action');
|
||||
|
||||
@@ -24,6 +25,7 @@ final class PhabricatorAuthDisableController
|
||||
}
|
||||
|
||||
$is_enable = ($action === 'enable');
|
||||
$done_uri = $config->getURI();
|
||||
|
||||
if ($request->isDialogFormPost()) {
|
||||
$xactions = array();
|
||||
@@ -39,8 +41,7 @@ final class PhabricatorAuthDisableController
|
||||
->setContinueOnNoEffect(true)
|
||||
->applyTransactions($config, $xactions);
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI(
|
||||
$this->getApplicationURI());
|
||||
return id(new AphrontRedirectResponse())->setURI($done_uri);
|
||||
}
|
||||
|
||||
if ($is_enable) {
|
||||
@@ -64,8 +65,9 @@ final class PhabricatorAuthDisableController
|
||||
// account and pop a warning like "YOU WILL NO LONGER BE ABLE TO LOGIN
|
||||
// YOU GOOF, YOU PROBABLY DO NOT MEAN TO DO THIS". None of this is
|
||||
// critical and we can wait to see how users manage to shoot themselves
|
||||
// in the feet. Shortly, `bin/auth` will be able to recover from these
|
||||
// types of mistakes.
|
||||
// in the feet.
|
||||
|
||||
// `bin/auth` can recover from these types of mistakes.
|
||||
|
||||
$title = pht('Disable Provider?');
|
||||
$body = pht(
|
||||
@@ -77,14 +79,11 @@ final class PhabricatorAuthDisableController
|
||||
$button = pht('Disable Provider');
|
||||
}
|
||||
|
||||
$dialog = id(new AphrontDialogView())
|
||||
->setUser($viewer)
|
||||
return $this->newDialog()
|
||||
->setTitle($title)
|
||||
->appendChild($body)
|
||||
->addCancelButton($this->getApplicationURI())
|
||||
->addCancelButton($done_uri)
|
||||
->addSubmitButton($button);
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,8 +6,9 @@ final class PhabricatorAuthEditController
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$this->requireApplicationCapability(
|
||||
AuthManageProvidersCapability::CAPABILITY);
|
||||
$viewer = $request->getUser();
|
||||
$provider_class = $request->getURIData('className');
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
$provider_class = $request->getStr('provider');
|
||||
$config_id = $request->getURIData('id');
|
||||
|
||||
if ($config_id) {
|
||||
@@ -155,12 +156,7 @@ final class PhabricatorAuthEditController
|
||||
->setContinueOnNoEffect(true)
|
||||
->applyTransactions($config, $xactions);
|
||||
|
||||
if ($provider->hasSetupStep() && $is_new) {
|
||||
$id = $config->getID();
|
||||
$next_uri = $this->getApplicationURI('config/edit/'.$id.'/');
|
||||
} else {
|
||||
$next_uri = $this->getApplicationURI();
|
||||
}
|
||||
$next_uri = $config->getURI();
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI($next_uri);
|
||||
}
|
||||
@@ -184,7 +180,7 @@ final class PhabricatorAuthEditController
|
||||
$crumb = pht('Edit Provider');
|
||||
$title = pht('Edit Auth Provider');
|
||||
$header_icon = 'fa-pencil';
|
||||
$cancel_uri = $this->getApplicationURI();
|
||||
$cancel_uri = $config->getURI();
|
||||
}
|
||||
|
||||
$header = id(new PHUIHeaderView())
|
||||
@@ -275,6 +271,7 @@ final class PhabricatorAuthEditController
|
||||
|
||||
$form = id(new AphrontFormView())
|
||||
->setUser($viewer)
|
||||
->addHiddenInput('provider', $provider_class)
|
||||
->appendChild(
|
||||
id(new AphrontFormCheckboxControl())
|
||||
->setLabel(pht('Allow'))
|
||||
@@ -346,18 +343,6 @@ final class PhabricatorAuthEditController
|
||||
$crumbs->addTextCrumb($crumb);
|
||||
$crumbs->setBorder(true);
|
||||
|
||||
$timeline = null;
|
||||
if (!$is_new) {
|
||||
$timeline = $this->buildTransactionTimeline(
|
||||
$config,
|
||||
new PhabricatorAuthProviderConfigTransactionQuery());
|
||||
$xactions = $timeline->getTransactions();
|
||||
foreach ($xactions as $xaction) {
|
||||
$xaction->setProvider($provider);
|
||||
}
|
||||
$timeline->setShouldTerminate(true);
|
||||
}
|
||||
|
||||
$form_box = id(new PHUIObjectBoxView())
|
||||
->setHeaderText(pht('Provider'))
|
||||
->setFormErrors($errors)
|
||||
@@ -369,7 +354,6 @@ final class PhabricatorAuthEditController
|
||||
->setFooter(array(
|
||||
$form_box,
|
||||
$footer,
|
||||
$timeline,
|
||||
));
|
||||
|
||||
return $this->newPage()
|
||||
|
||||
@@ -19,31 +19,18 @@ final class PhabricatorAuthListController
|
||||
|
||||
$id = $config->getID();
|
||||
|
||||
$edit_uri = $this->getApplicationURI('config/edit/'.$id.'/');
|
||||
$enable_uri = $this->getApplicationURI('config/enable/'.$id.'/');
|
||||
$disable_uri = $this->getApplicationURI('config/disable/'.$id.'/');
|
||||
$view_uri = $config->getURI();
|
||||
|
||||
$provider = $config->getProvider();
|
||||
if ($provider) {
|
||||
$name = $provider->getProviderName();
|
||||
} else {
|
||||
$name = $config->getProviderType().' ('.$config->getProviderClass().')';
|
||||
}
|
||||
$name = $provider->getProviderName();
|
||||
|
||||
$item->setHeader($name);
|
||||
$item
|
||||
->setHeader($name)
|
||||
->setHref($view_uri);
|
||||
|
||||
if ($provider) {
|
||||
$item->setHref($edit_uri);
|
||||
} else {
|
||||
$item->addAttribute(pht('Provider Implementation Missing!'));
|
||||
}
|
||||
|
||||
$domain = null;
|
||||
if ($provider) {
|
||||
$domain = $provider->getProviderDomain();
|
||||
if ($domain !== 'self') {
|
||||
$item->addAttribute($domain);
|
||||
}
|
||||
$domain = $provider->getProviderDomain();
|
||||
if ($domain !== 'self') {
|
||||
$item->addAttribute($domain);
|
||||
}
|
||||
|
||||
if ($config->getShouldAllowRegistration()) {
|
||||
@@ -54,21 +41,9 @@ final class PhabricatorAuthListController
|
||||
|
||||
if ($config->getIsEnabled()) {
|
||||
$item->setStatusIcon('fa-check-circle green');
|
||||
$item->addAction(
|
||||
id(new PHUIListItemView())
|
||||
->setIcon('fa-times')
|
||||
->setHref($disable_uri)
|
||||
->setDisabled(!$can_manage)
|
||||
->addSigil('workflow'));
|
||||
} else {
|
||||
$item->setStatusIcon('fa-ban red');
|
||||
$item->addIcon('fa-ban grey', pht('Disabled'));
|
||||
$item->addAction(
|
||||
id(new PHUIListItemView())
|
||||
->setIcon('fa-plus')
|
||||
->setHref($enable_uri)
|
||||
->setDisabled(!$can_manage)
|
||||
->addSigil('workflow'));
|
||||
}
|
||||
|
||||
$list->addItem($item);
|
||||
@@ -123,10 +98,11 @@ final class PhabricatorAuthListController
|
||||
|
||||
$view = id(new PHUITwoColumnView())
|
||||
->setHeader($header)
|
||||
->setFooter(array(
|
||||
$guidance,
|
||||
$list,
|
||||
));
|
||||
->setFooter(
|
||||
array(
|
||||
$guidance,
|
||||
$list,
|
||||
));
|
||||
|
||||
$nav = $this->newNavigation()
|
||||
->setCrumbs($crumbs)
|
||||
|
||||
@@ -6,44 +6,12 @@ final class PhabricatorAuthNewController
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$this->requireApplicationCapability(
|
||||
AuthManageProvidersCapability::CAPABILITY);
|
||||
$request = $this->getRequest();
|
||||
$viewer = $request->getUser();
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
$cancel_uri = $this->getApplicationURI();
|
||||
|
||||
$providers = PhabricatorAuthProvider::getAllBaseProviders();
|
||||
|
||||
$e_provider = null;
|
||||
$errors = array();
|
||||
|
||||
if ($request->isFormPost()) {
|
||||
$provider_string = $request->getStr('provider');
|
||||
if (!strlen($provider_string)) {
|
||||
$e_provider = pht('Required');
|
||||
$errors[] = pht('You must select an authentication provider.');
|
||||
} else {
|
||||
$found = false;
|
||||
foreach ($providers as $provider) {
|
||||
if (get_class($provider) === $provider_string) {
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$found) {
|
||||
$e_provider = pht('Invalid');
|
||||
$errors[] = pht('You must select a valid provider.');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$errors) {
|
||||
return id(new AphrontRedirectResponse())->setURI(
|
||||
$this->getApplicationURI('/config/new/'.$provider_string.'/'));
|
||||
}
|
||||
}
|
||||
|
||||
$options = id(new AphrontFormRadioButtonControl())
|
||||
->setLabel(pht('Provider'))
|
||||
->setName('provider')
|
||||
->setError($e_provider);
|
||||
|
||||
$configured = PhabricatorAuthProvider::getAllProviders();
|
||||
$configured_classes = array();
|
||||
foreach ($configured as $configured_provider) {
|
||||
@@ -55,57 +23,52 @@ final class PhabricatorAuthNewController
|
||||
$providers = msort($providers, 'getLoginOrder');
|
||||
$providers = array_diff_key($providers, $configured_classes) + $providers;
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
if (isset($configured_classes[get_class($provider)])) {
|
||||
$disabled = true;
|
||||
$description = pht('This provider is already configured.');
|
||||
$menu = id(new PHUIObjectItemListView())
|
||||
->setViewer($viewer)
|
||||
->setBig(true)
|
||||
->setFlush(true);
|
||||
|
||||
foreach ($providers as $provider_key => $provider) {
|
||||
$provider_class = get_class($provider);
|
||||
|
||||
$provider_uri = id(new PhutilURI('/config/edit/'))
|
||||
->replaceQueryParam('provider', $provider_class);
|
||||
$provider_uri = $this->getApplicationURI($provider_uri);
|
||||
|
||||
$already_exists = isset($configured_classes[get_class($provider)]);
|
||||
|
||||
$item = id(new PHUIObjectItemView())
|
||||
->setHeader($provider->getNameForCreate())
|
||||
->setImageIcon($provider->newIconView())
|
||||
->addAttribute($provider->getDescriptionForCreate());
|
||||
|
||||
if (!$already_exists) {
|
||||
$item
|
||||
->setHref($provider_uri)
|
||||
->setClickable(true);
|
||||
} else {
|
||||
$disabled = false;
|
||||
$description = $provider->getDescriptionForCreate();
|
||||
$item->setDisabled(true);
|
||||
}
|
||||
$options->addButton(
|
||||
get_class($provider),
|
||||
$provider->getNameForCreate(),
|
||||
$description,
|
||||
$disabled ? 'disabled' : null,
|
||||
$disabled);
|
||||
|
||||
if ($already_exists) {
|
||||
$messages = array();
|
||||
$messages[] = pht('You already have a provider of this type.');
|
||||
|
||||
$info = id(new PHUIInfoView())
|
||||
->setSeverity(PHUIInfoView::SEVERITY_WARNING)
|
||||
->setErrors($messages);
|
||||
|
||||
$item->appendChild($info);
|
||||
}
|
||||
|
||||
$menu->addItem($item);
|
||||
}
|
||||
|
||||
$form = id(new AphrontFormView())
|
||||
->setUser($viewer)
|
||||
->appendChild($options)
|
||||
->appendChild(
|
||||
id(new AphrontFormSubmitControl())
|
||||
->addCancelButton($this->getApplicationURI())
|
||||
->setValue(pht('Continue')));
|
||||
|
||||
$form_box = id(new PHUIObjectBoxView())
|
||||
->setHeaderText(pht('Provider'))
|
||||
->setFormErrors($errors)
|
||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||
->setForm($form);
|
||||
|
||||
$crumbs = $this->buildApplicationCrumbs();
|
||||
$crumbs->addTextCrumb(pht('Add Provider'));
|
||||
$crumbs->setBorder(true);
|
||||
|
||||
$title = pht('Add Auth Provider');
|
||||
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader($title)
|
||||
->setHeaderIcon('fa-plus-square');
|
||||
|
||||
$view = id(new PHUITwoColumnView())
|
||||
->setHeader($header)
|
||||
->setFooter(array(
|
||||
$form_box,
|
||||
));
|
||||
|
||||
return $this->newPage()
|
||||
->setTitle($title)
|
||||
->setCrumbs($crumbs)
|
||||
->appendChild($view);
|
||||
|
||||
return $this->newDialog()
|
||||
->setTitle(pht('Add Auth Provider'))
|
||||
->setWidth(AphrontDialogView::WIDTH_FORM)
|
||||
->appendChild($menu)
|
||||
->addCancelButton($cancel_uri);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
final class PhabricatorAuthProviderViewController
|
||||
extends PhabricatorAuthProviderConfigController {
|
||||
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$this->requireApplicationCapability(
|
||||
AuthManageProvidersCapability::CAPABILITY);
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
$id = $request->getURIData('id');
|
||||
|
||||
$config = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->requireCapabilities(
|
||||
array(
|
||||
PhabricatorPolicyCapability::CAN_VIEW,
|
||||
PhabricatorPolicyCapability::CAN_EDIT,
|
||||
))
|
||||
->withIDs(array($id))
|
||||
->executeOne();
|
||||
if (!$config) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
$header = $this->buildHeaderView($config);
|
||||
$properties = $this->buildPropertiesView($config);
|
||||
$curtain = $this->buildCurtain($config);
|
||||
|
||||
$timeline = $this->buildTransactionTimeline(
|
||||
$config,
|
||||
new PhabricatorAuthProviderConfigTransactionQuery());
|
||||
$timeline->setShouldTerminate(true);
|
||||
|
||||
$view = id(new PHUITwoColumnView())
|
||||
->setHeader($header)
|
||||
->setCurtain($curtain)
|
||||
->addPropertySection(pht('Details'), $properties)
|
||||
->setMainColumn($timeline);
|
||||
|
||||
$crumbs = $this->buildApplicationCrumbs()
|
||||
->addTextCrumb($config->getObjectName())
|
||||
->setBorder(true);
|
||||
|
||||
return $this->newPage()
|
||||
->setTitle(pht('Auth Provider: %s', $config->getDisplayName()))
|
||||
->setCrumbs($crumbs)
|
||||
->appendChild($view);
|
||||
}
|
||||
|
||||
private function buildHeaderView(PhabricatorAuthProviderConfig $config) {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$view = id(new PHUIHeaderView())
|
||||
->setViewer($viewer)
|
||||
->setHeader($config->getDisplayName());
|
||||
|
||||
if ($config->getIsEnabled()) {
|
||||
$view->setStatus('fa-check', 'bluegrey', pht('Enabled'));
|
||||
} else {
|
||||
$view->setStatus('fa-ban', 'red', pht('Disabled'));
|
||||
}
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
private function buildCurtain(PhabricatorAuthProviderConfig $config) {
|
||||
$viewer = $this->getViewer();
|
||||
$id = $config->getID();
|
||||
|
||||
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
||||
$viewer,
|
||||
$config,
|
||||
PhabricatorPolicyCapability::CAN_EDIT);
|
||||
|
||||
$curtain = $this->newCurtainView($config);
|
||||
|
||||
$curtain->addAction(
|
||||
id(new PhabricatorActionView())
|
||||
->setName(pht('Edit Auth Provider'))
|
||||
->setIcon('fa-pencil')
|
||||
->setHref($this->getApplicationURI("config/edit/{$id}/"))
|
||||
->setDisabled(!$can_edit)
|
||||
->setWorkflow(!$can_edit));
|
||||
|
||||
if ($config->getIsEnabled()) {
|
||||
$disable_uri = $this->getApplicationURI('config/disable/'.$id.'/');
|
||||
$disable_icon = 'fa-ban';
|
||||
$disable_text = pht('Disable Provider');
|
||||
} else {
|
||||
$disable_uri = $this->getApplicationURI('config/enable/'.$id.'/');
|
||||
$disable_icon = 'fa-check';
|
||||
$disable_text = pht('Enable Provider');
|
||||
}
|
||||
|
||||
$curtain->addAction(
|
||||
id(new PhabricatorActionView())
|
||||
->setName($disable_text)
|
||||
->setIcon($disable_icon)
|
||||
->setHref($disable_uri)
|
||||
->setDisabled(!$can_edit)
|
||||
->setWorkflow(true));
|
||||
|
||||
return $curtain;
|
||||
}
|
||||
|
||||
private function buildPropertiesView(PhabricatorAuthProviderConfig $config) {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$view = id(new PHUIPropertyListView())
|
||||
->setViewer($viewer);
|
||||
|
||||
$view->addProperty(
|
||||
pht('Provider Type'),
|
||||
$config->getProvider()->getProviderName());
|
||||
|
||||
return $view;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
final class PhabricatorAuthChallengeStatusController
|
||||
extends PhabricatorAuthController {
|
||||
|
||||
public function shouldAllowPartialSessions() {
|
||||
// We expect that users may request the status of an MFA challenge when
|
||||
// they hit the session upgrade gate on login.
|
||||
return true;
|
||||
}
|
||||
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$viewer = $this->getViewer();
|
||||
$id = $request->getURIData('id');
|
||||
$now = PhabricatorTime::getNow();
|
||||
|
||||
$result = new PhabricatorAuthChallengeUpdate();
|
||||
|
||||
$challenge = id(new PhabricatorAuthChallengeQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs(array($id))
|
||||
->withUserPHIDs(array($viewer->getPHID()))
|
||||
->withChallengeTTLBetween($now, null)
|
||||
->executeOne();
|
||||
if ($challenge) {
|
||||
$config = id(new PhabricatorAuthFactorConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs(array($challenge->getFactorPHID()))
|
||||
->executeOne();
|
||||
if ($config) {
|
||||
$provider = $config->getFactorProvider();
|
||||
$factor = $provider->getFactor();
|
||||
|
||||
$result = $factor->newChallengeStatusView(
|
||||
$config,
|
||||
$provider,
|
||||
$viewer,
|
||||
$challenge);
|
||||
}
|
||||
}
|
||||
|
||||
return id(new AphrontAjaxResponse())
|
||||
->setContent($result->newContent());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -45,7 +45,7 @@ final class PhabricatorAuthFactorProviderEditController
|
||||
|
||||
foreach ($factors as $factor_key => $factor) {
|
||||
$factor_uri = id(new PhutilURI('/mfa/edit/'))
|
||||
->setQueryParam('providerFactorKey', $factor_key);
|
||||
->replaceQueryParam('providerFactorKey', $factor_key);
|
||||
$factor_uri = $this->getApplicationURI($factor_uri);
|
||||
|
||||
$is_enabled = $factor->canCreateNewProvider();
|
||||
|
||||
@@ -147,7 +147,7 @@ final class PhabricatorAuthInviteEngine extends Phobject {
|
||||
// no address. Users can use password recovery to access the other
|
||||
// account if they really control the address.
|
||||
throw id(new PhabricatorAuthInviteAccountException(
|
||||
pht('Wrong Acount'),
|
||||
pht('Wrong Account'),
|
||||
pht(
|
||||
'You are logged in as %s, but the email address you just '.
|
||||
'clicked a link from is already the primary email address '.
|
||||
|
||||
@@ -714,7 +714,14 @@ final class PhabricatorAuthSessionEngine extends Phobject {
|
||||
if (isset($validation_results[$factor_phid])) {
|
||||
continue;
|
||||
}
|
||||
$validation_results[$factor_phid] = new PhabricatorAuthFactorResult();
|
||||
|
||||
$issued_challenges = idx($challenge_map, $factor_phid, array());
|
||||
|
||||
$validation_results[$factor_phid] = $impl->getResultForPrompt(
|
||||
$factor,
|
||||
$viewer,
|
||||
$request,
|
||||
$issued_challenges);
|
||||
}
|
||||
|
||||
throw id(new PhabricatorAuthHighSecurityRequiredException())
|
||||
|
||||
@@ -42,7 +42,7 @@ final class PhabricatorAuthMainMenuBarExtension
|
||||
$uri = new PhutilURI('/auth/start/');
|
||||
if ($controller) {
|
||||
$path = $controller->getRequest()->getPath();
|
||||
$uri->setQueryParam('next', $path);
|
||||
$uri->replaceQueryParam('next', $path);
|
||||
}
|
||||
|
||||
return id(new PHUIButtonView())
|
||||
|
||||
@@ -80,6 +80,14 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
return array();
|
||||
}
|
||||
|
||||
public function newChallengeStatusView(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
PhabricatorAuthFactorProvider $provider,
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorAuthChallenge $challenge) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this a factor which depends on the user's contact number?
|
||||
*
|
||||
@@ -123,6 +131,7 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
->setUserPHID($viewer->getPHID())
|
||||
->setSessionPHID($viewer->getSession()->getPHID())
|
||||
->setFactorPHID($config->getPHID())
|
||||
->setIsNewChallenge(true)
|
||||
->setWorkflowKey($engine->getWorkflowKey());
|
||||
}
|
||||
|
||||
@@ -209,11 +218,43 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
get_class($this)));
|
||||
}
|
||||
|
||||
$result->setIssuedChallenges($challenges);
|
||||
return $result;
|
||||
}
|
||||
|
||||
final public function getResultForPrompt(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
PhabricatorUser $viewer,
|
||||
AphrontRequest $request,
|
||||
array $challenges) {
|
||||
assert_instances_of($challenges, 'PhabricatorAuthChallenge');
|
||||
|
||||
$result = $this->newResultForPrompt(
|
||||
$config,
|
||||
$viewer,
|
||||
$request,
|
||||
$challenges);
|
||||
|
||||
if (!$this->isAuthResult($result)) {
|
||||
throw new Exception(
|
||||
pht(
|
||||
'Expected "newResultForPrompt()" to return an object of class "%s", '.
|
||||
'but it returned something else ("%s"; in "%s").',
|
||||
'PhabricatorAuthFactorResult',
|
||||
phutil_describe_type($result),
|
||||
get_class($this)));
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function newResultForPrompt(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
PhabricatorUser $viewer,
|
||||
AphrontRequest $request,
|
||||
array $challenges) {
|
||||
return $this->newResult();
|
||||
}
|
||||
|
||||
abstract protected function newResultFromIssuedChallenges(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
PhabricatorUser $viewer,
|
||||
@@ -241,8 +282,6 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
get_class($this)));
|
||||
}
|
||||
|
||||
$result->setIssuedChallenges($challenges);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -283,8 +322,11 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
|
||||
$error = $result->getErrorMessage();
|
||||
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-clock-o', 'red');
|
||||
$icon = $result->getIcon();
|
||||
if (!$icon) {
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-clock-o', 'red');
|
||||
}
|
||||
|
||||
return id(new PHUIFormTimerControl())
|
||||
->setIcon($icon)
|
||||
@@ -295,8 +337,11 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
private function newAnsweredControl(
|
||||
PhabricatorAuthFactorResult $result) {
|
||||
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-check-circle-o', 'green');
|
||||
$icon = $result->getIcon();
|
||||
if (!$icon) {
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-check-circle-o', 'green');
|
||||
}
|
||||
|
||||
return id(new PHUIFormTimerControl())
|
||||
->setIcon($icon)
|
||||
@@ -309,8 +354,11 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
|
||||
$error = $result->getErrorMessage();
|
||||
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-times', 'red');
|
||||
$icon = $result->getIcon();
|
||||
if (!$icon) {
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-times', 'red');
|
||||
}
|
||||
|
||||
return id(new PHUIFormTimerControl())
|
||||
->setIcon($icon)
|
||||
@@ -323,12 +371,24 @@ abstract class PhabricatorAuthFactor extends Phobject {
|
||||
|
||||
$error = $result->getErrorMessage();
|
||||
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-commenting', 'green');
|
||||
$icon = $result->getIcon();
|
||||
if (!$icon) {
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-commenting', 'green');
|
||||
}
|
||||
|
||||
return id(new PHUIFormTimerControl())
|
||||
$control = id(new PHUIFormTimerControl())
|
||||
->setIcon($icon)
|
||||
->appendChild($error);
|
||||
|
||||
$status_challenge = $result->getStatusChallenge();
|
||||
if ($status_challenge) {
|
||||
$id = $status_challenge->getID();
|
||||
$uri = "/auth/mfa/challenge/status/{$id}/";
|
||||
$control->setUpdateURI($uri);
|
||||
}
|
||||
|
||||
return $control;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,8 @@ final class PhabricatorAuthFactorResult
|
||||
private $errorMessage;
|
||||
private $value;
|
||||
private $issuedChallenges = array();
|
||||
private $icon;
|
||||
private $statusChallenge;
|
||||
|
||||
public function setAnsweredChallenge(PhabricatorAuthChallenge $challenge) {
|
||||
if (!$challenge->getIsAnsweredChallenge()) {
|
||||
@@ -33,6 +35,15 @@ final class PhabricatorAuthFactorResult
|
||||
return $this->answeredChallenge;
|
||||
}
|
||||
|
||||
public function setStatusChallenge(PhabricatorAuthChallenge $challenge) {
|
||||
$this->statusChallenge = $challenge;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getStatusChallenge() {
|
||||
return $this->statusChallenge;
|
||||
}
|
||||
|
||||
public function getIsValid() {
|
||||
return (bool)$this->getAnsweredChallenge();
|
||||
}
|
||||
@@ -82,14 +93,13 @@ final class PhabricatorAuthFactorResult
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public function setIssuedChallenges(array $issued_challenges) {
|
||||
assert_instances_of($issued_challenges, 'PhabricatorAuthChallenge');
|
||||
$this->issuedChallenges = $issued_challenges;
|
||||
public function setIcon(PHUIIconView $icon) {
|
||||
$this->icon = $icon;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getIssuedChallenges() {
|
||||
return $this->issuedChallenges;
|
||||
public function getIcon() {
|
||||
return $this->icon;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -585,7 +585,7 @@ final class PhabricatorDuoAuthFactor
|
||||
$result = $this->newDuoFuture($provider)
|
||||
->setHTTPMethod('GET')
|
||||
->setMethod('auth_status', $parameters)
|
||||
->setTimeout(5)
|
||||
->setTimeout(3)
|
||||
->resolve();
|
||||
|
||||
$state = $result['response']['result'];
|
||||
@@ -612,7 +612,22 @@ final class PhabricatorDuoAuthFactor
|
||||
return $this->newResult()
|
||||
->setAnsweredChallenge($challenge);
|
||||
case 'waiting':
|
||||
// No result yet, we'll render a default state later on.
|
||||
// If we didn't just issue this challenge, give the user a stronger
|
||||
// hint that they need to follow the instructions.
|
||||
if (!$challenge->getIsNewChallenge()) {
|
||||
return $this->newResult()
|
||||
->setIsContinue(true)
|
||||
->setIcon(
|
||||
id(new PHUIIconView())
|
||||
->setIcon('fa-exclamation-triangle', 'yellow'))
|
||||
->setErrorMessage(
|
||||
pht(
|
||||
'You must approve the challenge which was sent to your '.
|
||||
'phone. Open the Duo application and confirm the challenge, '.
|
||||
'then continue.'));
|
||||
}
|
||||
|
||||
// Otherwise, we'll construct a default message later on.
|
||||
break;
|
||||
default:
|
||||
case 'deny':
|
||||
@@ -646,15 +661,6 @@ final class PhabricatorDuoAuthFactor
|
||||
PhabricatorAuthFactorResult $result) {
|
||||
|
||||
$control = $this->newAutomaticControl($result);
|
||||
if (!$control) {
|
||||
$result = $this->newResult()
|
||||
->setIsContinue(true)
|
||||
->setErrorMessage(
|
||||
pht(
|
||||
'A challenge has been sent to your phone. Open the Duo '.
|
||||
'application and confirm the challenge, then continue.'));
|
||||
$control = $this->newAutomaticControl($result);
|
||||
}
|
||||
|
||||
$control
|
||||
->setLabel(pht('Duo'))
|
||||
@@ -666,8 +672,7 @@ final class PhabricatorDuoAuthFactor
|
||||
public function getRequestHasChallengeResponse(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
AphrontRequest $request) {
|
||||
$value = $this->getChallengeResponseFromRequest($config, $request);
|
||||
return (bool)strlen($value);
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function newResultFromChallengeResponse(
|
||||
@@ -676,39 +681,38 @@ final class PhabricatorDuoAuthFactor
|
||||
AphrontRequest $request,
|
||||
array $challenges) {
|
||||
|
||||
return $this->getResultForPrompt(
|
||||
$config,
|
||||
$viewer,
|
||||
$request,
|
||||
$challenges);
|
||||
}
|
||||
|
||||
protected function newResultForPrompt(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
PhabricatorUser $viewer,
|
||||
AphrontRequest $request,
|
||||
array $challenges) {
|
||||
|
||||
$result = $this->newResult()
|
||||
->setIsContinue(true)
|
||||
->setErrorMessage(
|
||||
pht(
|
||||
'A challenge has been sent to your phone. Open the Duo '.
|
||||
'application and confirm the challenge, then continue.'));
|
||||
|
||||
$challenge = $this->getChallengeForCurrentContext(
|
||||
$config,
|
||||
$viewer,
|
||||
$challenges);
|
||||
|
||||
$code = $this->getChallengeResponseFromRequest(
|
||||
$config,
|
||||
$request);
|
||||
|
||||
$result = $this->newResult()
|
||||
->setValue($code);
|
||||
|
||||
if ($challenge->getIsAnsweredChallenge()) {
|
||||
return $result->setAnsweredChallenge($challenge);
|
||||
if ($challenge) {
|
||||
$result
|
||||
->setStatusChallenge($challenge)
|
||||
->setIcon(
|
||||
id(new PHUIIconView())
|
||||
->setIcon('fa-refresh', 'green ph-spin'));
|
||||
}
|
||||
|
||||
if (phutil_hashes_are_identical($code, $challenge->getChallengeKey())) {
|
||||
$ttl = PhabricatorTime::getNow() + phutil_units('15 minutes in seconds');
|
||||
|
||||
$challenge
|
||||
->markChallengeAsAnswered($ttl);
|
||||
|
||||
return $result->setAnsweredChallenge($challenge);
|
||||
}
|
||||
|
||||
if (strlen($code)) {
|
||||
$error_message = pht('Invalid');
|
||||
} else {
|
||||
$error_message = pht('Required');
|
||||
}
|
||||
|
||||
$result->setErrorMessage($error_message);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -810,4 +814,54 @@ final class PhabricatorDuoAuthFactor
|
||||
$hostname));
|
||||
}
|
||||
|
||||
public function newChallengeStatusView(
|
||||
PhabricatorAuthFactorConfig $config,
|
||||
PhabricatorAuthFactorProvider $provider,
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorAuthChallenge $challenge) {
|
||||
|
||||
$duo_xaction = $challenge->getChallengeKey();
|
||||
|
||||
$parameters = array(
|
||||
'txid' => $duo_xaction,
|
||||
);
|
||||
|
||||
$default_result = id(new PhabricatorAuthChallengeUpdate())
|
||||
->setRetry(true);
|
||||
|
||||
try {
|
||||
$result = $this->newDuoFuture($provider)
|
||||
->setHTTPMethod('GET')
|
||||
->setMethod('auth_status', $parameters)
|
||||
->setTimeout(5)
|
||||
->resolve();
|
||||
|
||||
$state = $result['response']['result'];
|
||||
} catch (HTTPFutureCURLResponseStatus $exception) {
|
||||
// If we failed or timed out, retry. Usually, this is a timeout.
|
||||
return id(new PhabricatorAuthChallengeUpdate())
|
||||
->setRetry(true);
|
||||
}
|
||||
|
||||
// For now, don't update the view for anything but an "Allow". Updates
|
||||
// here are just about providing more visual feedback for user convenience.
|
||||
if ($state !== 'allow') {
|
||||
return id(new PhabricatorAuthChallengeUpdate())
|
||||
->setRetry(false);
|
||||
}
|
||||
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-check-circle-o', 'green');
|
||||
|
||||
$view = id(new PHUIFormTimerControl())
|
||||
->setIcon($icon)
|
||||
->appendChild(pht('You responded to this challenge correctly.'))
|
||||
->newTimerView();
|
||||
|
||||
return id(new PhabricatorAuthChallengeUpdate())
|
||||
->setState('allow')
|
||||
->setRetry(false)
|
||||
->setMarkup($view);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -128,6 +128,7 @@ final class PhabricatorTOTPAuthFactor extends PhabricatorAuthFactor {
|
||||
->setLabel(pht('TOTP Code'))
|
||||
->setName('totpcode')
|
||||
->setValue($code)
|
||||
->setAutofocus(true)
|
||||
->setError($e_code));
|
||||
|
||||
}
|
||||
|
||||
@@ -80,11 +80,6 @@ final class PhabricatorDuoFuture
|
||||
$host = $this->apiHostname;
|
||||
$host = phutil_utf8_strtolower($host);
|
||||
|
||||
$uri = id(new PhutilURI(''))
|
||||
->setProtocol('https')
|
||||
->setDomain($host)
|
||||
->setPath($path);
|
||||
|
||||
$data = $this->parameters;
|
||||
$date = date('r');
|
||||
|
||||
@@ -109,11 +104,19 @@ final class PhabricatorDuoFuture
|
||||
$signature = new PhutilOpaqueEnvelope($signature);
|
||||
|
||||
if ($http_method === 'GET') {
|
||||
$uri->setQueryParams($data);
|
||||
$data = array();
|
||||
$uri_data = $data;
|
||||
$body_data = array();
|
||||
} else {
|
||||
$uri_data = array();
|
||||
$body_data = $data;
|
||||
}
|
||||
|
||||
$future = id(new HTTPSFuture($uri, $data))
|
||||
$uri = id(new PhutilURI('', $uri_data))
|
||||
->setProtocol('https')
|
||||
->setDomain($host)
|
||||
->setPath($path);
|
||||
|
||||
$future = id(new HTTPSFuture($uri, $body_data))
|
||||
->setHTTPBasicAuthCredentials($this->integrationKey, $signature)
|
||||
->setMethod($http_method)
|
||||
->addHeader('Accept', 'application/json')
|
||||
|
||||
@@ -10,6 +10,26 @@ final class PhabricatorAuthProvidersGuidanceEngineExtension
|
||||
}
|
||||
|
||||
public function generateGuidance(PhabricatorGuidanceContext $context) {
|
||||
$configs = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withIsEnabled(true)
|
||||
->execute();
|
||||
|
||||
$allows_registration = false;
|
||||
foreach ($configs as $config) {
|
||||
$provider = $config->getProvider();
|
||||
if ($provider->shouldAllowRegistration()) {
|
||||
$allows_registration = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If no provider allows registration, we don't need provide any warnings
|
||||
// about registration being too open.
|
||||
if (!$allows_registration) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$domains_key = 'auth.email-domains';
|
||||
$domains_link = $this->renderConfigLink($domains_key);
|
||||
$domains_value = PhabricatorEnv::getEnvConfig($domains_key);
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
<?php
|
||||
|
||||
abstract class PhabricatorAuthLoginHandler
|
||||
extends Phobject {
|
||||
|
||||
private $request;
|
||||
private $delegatingController;
|
||||
|
||||
public function getAuthLoginHeaderContent() {
|
||||
return array();
|
||||
}
|
||||
|
||||
final public function setDelegatingController(AphrontController $controller) {
|
||||
$this->delegatingController = $controller;
|
||||
return $this;
|
||||
}
|
||||
|
||||
final public function getDelegatingController() {
|
||||
return $this->delegatingController;
|
||||
}
|
||||
|
||||
final public function setRequest(AphrontRequest $request) {
|
||||
$this->request = $request;
|
||||
return $this;
|
||||
}
|
||||
|
||||
final public function getRequest() {
|
||||
return $this->request;
|
||||
}
|
||||
|
||||
final public static function getAllHandlers() {
|
||||
return id(new PhutilClassMapQuery())
|
||||
->setAncestorClass(__CLASS__)
|
||||
->execute();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
final class PhabricatorAuthLinkMessageType
|
||||
extends PhabricatorAuthMessageType {
|
||||
|
||||
const MESSAGEKEY = 'auth.link';
|
||||
|
||||
public function getDisplayName() {
|
||||
return pht('Unlinked Account Instructions');
|
||||
}
|
||||
|
||||
public function getShortDescription() {
|
||||
return pht(
|
||||
'Guidance shown after a user logs in with an email link and is '.
|
||||
'prompted to link an external account.');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -161,7 +161,7 @@ abstract class PhabricatorAuthProvider extends Phobject {
|
||||
abstract public function processLoginRequest(
|
||||
PhabricatorAuthLoginController $controller);
|
||||
|
||||
public function buildLinkForm(PhabricatorAuthLinkController $controller) {
|
||||
public function buildLinkForm($controller) {
|
||||
return $this->renderLoginForm($controller->getRequest(), $mode = 'link');
|
||||
}
|
||||
|
||||
@@ -220,9 +220,7 @@ abstract class PhabricatorAuthProvider extends Phobject {
|
||||
$adapter->getAdapterDomain(),
|
||||
$account_id);
|
||||
if (!$account) {
|
||||
$account = id(new PhabricatorExternalAccount())
|
||||
->setAccountType($adapter->getAdapterType())
|
||||
->setAccountDomain($adapter->getAdapterDomain())
|
||||
$account = $this->newExternalAccount()
|
||||
->setAccountID($account_id);
|
||||
}
|
||||
|
||||
@@ -299,8 +297,18 @@ abstract class PhabricatorAuthProvider extends Phobject {
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getDefaultExternalAccount() {
|
||||
throw new PhutilMethodNotImplementedException();
|
||||
public function newDefaultExternalAccount() {
|
||||
return $this->newExternalAccount();
|
||||
}
|
||||
|
||||
protected function newExternalAccount() {
|
||||
$config = $this->getProviderConfig();
|
||||
$adapter = $this->getAdapter();
|
||||
|
||||
return id(new PhabricatorExternalAccount())
|
||||
->setAccountType($adapter->getAdapterType())
|
||||
->setAccountDomain($adapter->getAdapterDomain())
|
||||
->setProviderConfigPHID($config->getPHID());
|
||||
}
|
||||
|
||||
public function getLoginOrder() {
|
||||
@@ -311,6 +319,12 @@ abstract class PhabricatorAuthProvider extends Phobject {
|
||||
return 'Generic';
|
||||
}
|
||||
|
||||
public function newIconView() {
|
||||
return id(new PHUIIconView())
|
||||
->setSpriteSheet(PHUIIconView::SPRITE_LOGIN)
|
||||
->setSpriteIcon($this->getLoginIcon());
|
||||
}
|
||||
|
||||
public function isLoginFormAButton() {
|
||||
return false;
|
||||
}
|
||||
@@ -432,12 +446,13 @@ abstract class PhabricatorAuthProvider extends Phobject {
|
||||
|
||||
$uri = $attributes['uri'];
|
||||
$uri = new PhutilURI($uri);
|
||||
$params = $uri->getQueryParams();
|
||||
$uri->setQueryParams(array());
|
||||
$params = $uri->getQueryParamsAsPairList();
|
||||
$uri->removeAllQueryParams();
|
||||
|
||||
$content = array($button);
|
||||
|
||||
foreach ($params as $key => $value) {
|
||||
foreach ($params as $pair) {
|
||||
list($key, $value) = $pair;
|
||||
$content[] = phutil_tag(
|
||||
'input',
|
||||
array(
|
||||
|
||||
@@ -47,6 +47,14 @@ final class PhabricatorFacebookAuthProvider
|
||||
return 'Facebook';
|
||||
}
|
||||
|
||||
protected function getContentSecurityPolicyFormActions() {
|
||||
return array(
|
||||
// See T13254. After login with a mobile device, Facebook may redirect
|
||||
// to the mobile site.
|
||||
'https://m.facebook.com/',
|
||||
);
|
||||
}
|
||||
|
||||
public function readFormValuesFromProvider() {
|
||||
$require_secure = $this->getProviderConfig()->getProperty(
|
||||
self::KEY_REQUIRE_SECURE);
|
||||
@@ -114,15 +122,4 @@ final class PhabricatorFacebookAuthProvider
|
||||
return parent::renderConfigPropertyTransactionTitle($xaction);
|
||||
}
|
||||
|
||||
public static function getFacebookApplicationID() {
|
||||
$providers = PhabricatorAuthProvider::getAllProviders();
|
||||
$fb_provider = idx($providers, 'facebook:facebook.com');
|
||||
if (!$fb_provider) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $fb_provider->getProviderConfig()->getProperty(
|
||||
self::PROPERTY_APP_ID);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@ final class PhabricatorLDAPAuthProvider extends PhabricatorAuthProvider {
|
||||
id(new AphrontFormTextControl())
|
||||
->setLabel(pht('LDAP Username'))
|
||||
->setName('ldap_username')
|
||||
->setAutofocus(true)
|
||||
->setValue($v_user)
|
||||
->setError($e_user))
|
||||
->appendChild(
|
||||
|
||||
@@ -159,8 +159,7 @@ final class PhabricatorPasswordAuthProvider extends PhabricatorAuthProvider {
|
||||
return $dialog;
|
||||
}
|
||||
|
||||
public function buildLinkForm(
|
||||
PhabricatorAuthLinkController $controller) {
|
||||
public function buildLinkForm($controller) {
|
||||
throw new Exception(pht("Password providers can't be linked."));
|
||||
}
|
||||
|
||||
@@ -256,6 +255,7 @@ final class PhabricatorPasswordAuthProvider extends PhabricatorAuthProvider {
|
||||
id(new AphrontFormTextControl())
|
||||
->setLabel(pht('Username or Email'))
|
||||
->setName('username')
|
||||
->setAutofocus(true)
|
||||
->setValue($v_user)
|
||||
->setError($e_user))
|
||||
->appendChild(
|
||||
@@ -385,14 +385,6 @@ final class PhabricatorPasswordAuthProvider extends PhabricatorAuthProvider {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getDefaultExternalAccount() {
|
||||
$adapter = $this->getAdapter();
|
||||
|
||||
return id(new PhabricatorExternalAccount())
|
||||
->setAccountType($adapter->getAdapterType())
|
||||
->setAccountDomain($adapter->getAdapterDomain());
|
||||
}
|
||||
|
||||
protected function willSaveAccount(PhabricatorExternalAccount $account) {
|
||||
parent::willSaveAccount($account);
|
||||
$account->setUserPHID($account->getAccountID());
|
||||
|
||||
@@ -6,11 +6,7 @@ final class PhabricatorAuthProviderConfigQuery
|
||||
private $ids;
|
||||
private $phids;
|
||||
private $providerClasses;
|
||||
|
||||
const STATUS_ALL = 'status:all';
|
||||
const STATUS_ENABLED = 'status:enabled';
|
||||
|
||||
private $status = self::STATUS_ALL;
|
||||
private $isEnabled;
|
||||
|
||||
public function withPHIDs(array $phids) {
|
||||
$this->phids = $phids;
|
||||
@@ -22,40 +18,26 @@ final class PhabricatorAuthProviderConfigQuery
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withStatus($status) {
|
||||
$this->status = $status;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withProviderClasses(array $classes) {
|
||||
$this->providerClasses = $classes;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public static function getStatusOptions() {
|
||||
return array(
|
||||
self::STATUS_ALL => pht('All Providers'),
|
||||
self::STATUS_ENABLED => pht('Enabled Providers'),
|
||||
);
|
||||
public function withIsEnabled($is_enabled) {
|
||||
$this->isEnabled = $is_enabled;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function newResultObject() {
|
||||
return new PhabricatorAuthProviderConfig();
|
||||
}
|
||||
|
||||
protected function loadPage() {
|
||||
$table = new PhabricatorAuthProviderConfig();
|
||||
$conn_r = $table->establishConnection('r');
|
||||
|
||||
$data = queryfx_all(
|
||||
$conn_r,
|
||||
'SELECT * FROM %T %Q %Q %Q',
|
||||
$table->getTableName(),
|
||||
$this->buildWhereClause($conn_r),
|
||||
$this->buildOrderClause($conn_r),
|
||||
$this->buildLimitClause($conn_r));
|
||||
|
||||
return $table->loadAllFromArray($data);
|
||||
return $this->loadStandardPage($this->newResultObject());
|
||||
}
|
||||
|
||||
protected function buildWhereClause(AphrontDatabaseConnection $conn) {
|
||||
$where = array();
|
||||
protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
|
||||
$where = parent::buildWhereClauseParts($conn);
|
||||
|
||||
if ($this->ids !== null) {
|
||||
$where[] = qsprintf(
|
||||
@@ -78,22 +60,27 @@ final class PhabricatorAuthProviderConfigQuery
|
||||
$this->providerClasses);
|
||||
}
|
||||
|
||||
$status = $this->status;
|
||||
switch ($status) {
|
||||
case self::STATUS_ALL:
|
||||
break;
|
||||
case self::STATUS_ENABLED:
|
||||
$where[] = qsprintf(
|
||||
$conn,
|
||||
'isEnabled = 1');
|
||||
break;
|
||||
default:
|
||||
throw new Exception(pht("Unknown status '%s'!", $status));
|
||||
if ($this->isEnabled !== null) {
|
||||
$where[] = qsprintf(
|
||||
$conn,
|
||||
'isEnabled = %d',
|
||||
(int)$this->isEnabled);
|
||||
}
|
||||
|
||||
$where[] = $this->buildPagingClause($conn);
|
||||
return $where;
|
||||
}
|
||||
|
||||
return $this->formatWhereClause($conn, $where);
|
||||
protected function willFilterPage(array $configs) {
|
||||
|
||||
foreach ($configs as $key => $config) {
|
||||
$provider = $config->getProvider();
|
||||
if (!$provider) {
|
||||
unset($configs[$key]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return $configs;
|
||||
}
|
||||
|
||||
public function getQueryApplicationClass() {
|
||||
|
||||
@@ -21,6 +21,7 @@ final class PhabricatorExternalAccountQuery
|
||||
private $userPHIDs;
|
||||
private $needImages;
|
||||
private $accountSecrets;
|
||||
private $providerConfigPHIDs;
|
||||
|
||||
public function withUserPHIDs(array $user_phids) {
|
||||
$this->userPHIDs = $user_phids;
|
||||
@@ -62,6 +63,11 @@ final class PhabricatorExternalAccountQuery
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function withProviderConfigPHIDs(array $phids) {
|
||||
$this->providerConfigPHIDs = $phids;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function newResultObject() {
|
||||
return new PhabricatorExternalAccount();
|
||||
}
|
||||
@@ -71,6 +77,26 @@ final class PhabricatorExternalAccountQuery
|
||||
}
|
||||
|
||||
protected function willFilterPage(array $accounts) {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$configs = id(new PhabricatorAuthProviderConfigQuery())
|
||||
->setViewer($viewer)
|
||||
->withPHIDs(mpull($accounts, 'getProviderConfigPHID'))
|
||||
->execute();
|
||||
$configs = mpull($configs, null, 'getPHID');
|
||||
|
||||
foreach ($accounts as $key => $account) {
|
||||
$config_phid = $account->getProviderConfigPHID();
|
||||
$config = idx($configs, $config_phid);
|
||||
|
||||
if (!$config) {
|
||||
unset($accounts[$key]);
|
||||
continue;
|
||||
}
|
||||
|
||||
$account->attachProviderConfig($config);
|
||||
}
|
||||
|
||||
if ($this->needImages) {
|
||||
$file_phids = mpull($accounts, 'getProfileImagePHID');
|
||||
$file_phids = array_filter($file_phids);
|
||||
@@ -161,6 +187,13 @@ final class PhabricatorExternalAccountQuery
|
||||
$this->accountSecrets);
|
||||
}
|
||||
|
||||
if ($this->providerConfigPHIDs !== null) {
|
||||
$where[] = qsprintf(
|
||||
$conn,
|
||||
'providerConfigPHID IN (%Ls)',
|
||||
$this->providerConfigPHIDs);
|
||||
}
|
||||
|
||||
return $where;
|
||||
}
|
||||
|
||||
@@ -168,35 +201,4 @@ final class PhabricatorExternalAccountQuery
|
||||
return 'PhabricatorPeopleApplication';
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to find an external account and if none exists creates a new
|
||||
* external account with a shiny new ID and PHID.
|
||||
*
|
||||
* NOTE: This function assumes the first item in various query parameters is
|
||||
* the correct value to use in creating a new external account.
|
||||
*/
|
||||
public function loadOneOrCreate() {
|
||||
$account = $this->executeOne();
|
||||
if (!$account) {
|
||||
$account = new PhabricatorExternalAccount();
|
||||
if ($this->accountIDs) {
|
||||
$account->setAccountID(reset($this->accountIDs));
|
||||
}
|
||||
if ($this->accountTypes) {
|
||||
$account->setAccountType(reset($this->accountTypes));
|
||||
}
|
||||
if ($this->accountDomains) {
|
||||
$account->setAccountDomain(reset($this->accountDomains));
|
||||
}
|
||||
if ($this->accountSecrets) {
|
||||
$account->setAccountSecret(reset($this->accountSecrets));
|
||||
}
|
||||
if ($this->userPHIDs) {
|
||||
$account->setUserPHID(reset($this->userPHIDs));
|
||||
}
|
||||
$account->save();
|
||||
}
|
||||
return $account;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ final class PhabricatorAuthChallenge
|
||||
protected $properties = array();
|
||||
|
||||
private $responseToken;
|
||||
private $isNewChallenge;
|
||||
|
||||
const HTTPKEY = '__hisec.challenges__';
|
||||
const TOKEN_DIGEST_KEY = 'auth.challenge.token';
|
||||
@@ -241,6 +242,15 @@ final class PhabricatorAuthChallenge
|
||||
return $this->properties[$key];
|
||||
}
|
||||
|
||||
public function setIsNewChallenge($is_new_challenge) {
|
||||
$this->isNewChallenge = $is_new_challenge;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getIsNewChallenge() {
|
||||
return $this->isNewChallenge;
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||
|
||||
|
||||
@@ -11,10 +11,6 @@ final class PhabricatorAuthPasswordTransaction
|
||||
return PhabricatorAuthPasswordPHIDType::TYPECONST;
|
||||
}
|
||||
|
||||
public function getApplicationTransactionCommentObject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getBaseTransactionClass() {
|
||||
return 'PhabricatorAuthPasswordTransactionType';
|
||||
}
|
||||
|
||||
@@ -83,6 +83,27 @@ final class PhabricatorAuthProviderConfig
|
||||
return $this->provider;
|
||||
}
|
||||
|
||||
public function getURI() {
|
||||
return '/auth/config/view/'.$this->getID().'/';
|
||||
}
|
||||
|
||||
public function getObjectName() {
|
||||
return pht('Auth Provider %d', $this->getID());
|
||||
}
|
||||
|
||||
public function getDisplayName() {
|
||||
return $this->getProvider()->getProviderName();
|
||||
}
|
||||
|
||||
public function getSortVector() {
|
||||
return id(new PhutilSortVector())
|
||||
->addString($this->getDisplayName());
|
||||
}
|
||||
|
||||
public function newIconView() {
|
||||
return $this->getProvider()->newIconView();
|
||||
}
|
||||
|
||||
|
||||
/* -( PhabricatorApplicationTransactionInterface )------------------------- */
|
||||
|
||||
|
||||
@@ -33,10 +33,6 @@ final class PhabricatorAuthProviderConfigTransaction
|
||||
return PhabricatorAuthAuthProviderPHIDType::TYPECONST;
|
||||
}
|
||||
|
||||
public function getApplicationTransactionCommentObject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getIcon() {
|
||||
$old = $this->getOldValue();
|
||||
$new = $this->getNewValue();
|
||||
|
||||
@@ -15,10 +15,6 @@ final class PhabricatorAuthSSHKeyTransaction
|
||||
return PhabricatorAuthSSHKeyPHIDType::TYPECONST;
|
||||
}
|
||||
|
||||
public function getApplicationTransactionCommentObject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getTitle() {
|
||||
$author_phid = $this->getAuthorPHID();
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
final class PhabricatorAuthChallengeUpdate
|
||||
extends Phobject {
|
||||
|
||||
private $retry = false;
|
||||
private $state;
|
||||
private $markup;
|
||||
|
||||
public function setRetry($retry) {
|
||||
$this->retry = $retry;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getRetry() {
|
||||
return $this->retry;
|
||||
}
|
||||
|
||||
public function setState($state) {
|
||||
$this->state = $state;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getState() {
|
||||
return $this->state;
|
||||
}
|
||||
|
||||
public function setMarkup($markup) {
|
||||
$this->markup = $markup;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getMarkup() {
|
||||
return $this->markup;
|
||||
}
|
||||
|
||||
public function newContent() {
|
||||
return array(
|
||||
'retry' => $this->getRetry(),
|
||||
'state' => $this->getState(),
|
||||
'markup' => $this->getMarkup(),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -108,11 +108,11 @@ final class PhabricatorBadgesQuery
|
||||
) + parent::getOrderableColumns();
|
||||
}
|
||||
|
||||
protected function getPagingValueMap($cursor, array $keys) {
|
||||
$badge = $this->loadCursorObject($cursor);
|
||||
|
||||
protected function newPagingMapFromPartialObject($object) {
|
||||
return array(
|
||||
'quality' => $badge->getQuality(),
|
||||
'id' => $badge->getID(),
|
||||
'id' => (int)$object->getID(),
|
||||
'quality' => $object->getQuality(),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -608,6 +608,7 @@ abstract class PhabricatorController extends AphrontController {
|
||||
$this->setCurrentApplication($application);
|
||||
|
||||
$controller = new LegalpadDocumentSignController();
|
||||
$controller->setIsSessionGate(true);
|
||||
return $this->delegateToController($controller);
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user